sql server存储过程的优点
1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2.当对数据库进行复杂操作时(如对多个表进行 Update,Insert,Query,Delete 时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。这些操作,如果用程序来完成,就变成了一条条的 SQL 语句,可能要多次连接数据库。而换成存储,只需要连接一次数据库就可以了。
3.存储过程可以重复使用,可减少数据库开发人员的工作量。
4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权。
一、定义变量--简单赋值declare @a intset @a=5print @a--使用select语句赋值declare @user1 nvarchar(50)select @user1='张三'print @user1declare @user2 nvarchar(50)select @user2 = Name from ST_User where ID=1print @user2--使用update语句赋值declare @user3 nvarchar(50)update ST_User set @user3 = Name where ID=1print @user3二、表、临时表、表变量--创建临时表1create table #DU_User1([ID] [int] NOT NULL,[Oid] [int] NOT NULL,[Login] [nvarchar](50) NOT NULL,[Rtx] [nvarchar](4) NOT NULL,[Name] [nvarchar](5) NOT NULL,[Password] [nvarchar](max) NULL,[State] [nvarchar](8) NOT NULL);--向临时表1插入一条记录insert into #DU_User1 (ID,Oid,[Login],Rtx,Name,[Password],State) values (100,2,'LS','0000','临时','321','特殊');--从ST_User查询数据,填充至新生成的临时表select * into #DU_User2 from ST_User where ID<8--查询并联合两临时表select * from #DU_User2 where ID<3 union select * from #DU_User1--删除两临时表drop table #DU_User1drop table #DU_User2--创建临时表CREATE TABLE #t([ID] [int] NOT NULL,[Oid] [int] NOT NULL,[Login] [nvarchar](50) NOT NULL,[Rtx] [nvarchar](4) NOT NULL,[Name] [nvarchar](5) NOT NULL,[Password] [nvarchar](max) NULL,[State] [nvarchar](8) NOT NULL,)--将查询结果集(多条数据)插入临时表insert into #t select * from ST_User--不能这样插入 (这样是获取结果集并创建临时表#t)--select * into #t from dbo.ST_User--添加一列,为int型自增长子段alter table #t add [myid] int NOT NULL IDENTITY(1,1)--添加一列,默认填充唯一标识alter table #t add [myid1] uniqueidentifier NOT NULL default(newid())select * from #tdrop table #t--给查询结果集增加自增长列--无主键时:select IDENTITY(int,1,1)as ID, Name,[Login],[Password] into #t from ST_Userselect * from #t--有主键时:select (select SUM(1) from ST_User where ID<= a.ID) as myID,* from ST_User a order by myID--定义表变量declare @t table(id int not null,msg nvarchar(50) null)insert into @t values(1,'1')insert into @t values(2,'2')select * from @t三、循环--while循环计算1到100的和declare @a intdeclare @sum intset @a=1set @sum=0while @a<=100beginset @sum+=@aset @a+=1endprint @sum四、条件语句--if,else条件分支if(1+1=2)beginprint '对'endelsebeginprint '错'end--when then条件分支declare @today intdeclare @week nvarchar(3)set @today=3set @week=casewhen @today=1 then '星期一'when @today=2 then '星期二'when @today=3 then '星期三'when @today=4 then '星期四'when @today=5 then '星期五'when @today=6 then '星期六'when @today=7 then '星期日'else '值错误'endprint @week五、游标declare @ID intdeclare @Oid intdeclare @Login varchar(50)--定义一个游标declare user_cur cursor for select ID,Oid,[Login] from ST_User--打开游标open user_curwhile @@fetch_status=0begin--读取游标fetch next from user_cur into @ID,@Oid,@Loginprint @ID--print @Loginendclose user_cur--摧毁游标deallocate user_cur六、触发器触发器中的临时表:Inserted存放进行insert和update 操作后的数据Deleted存放进行delete 和update操作前的数据--创建触发器Create trigger User_OnUpdateOn ST_Userfor UpdateAsdeclare @msg nvarchar(50)--@msg记录修改情况select @msg = N'姓名从“' + Deleted.Name + N'”修改为“' + Inserted.Name + '”' from Inserted,Deleted--插入日志表insert into [LOG](MSG)values(@msg)--删除触发器drop trigger User_OnUpdate七、存储过程--创建带output参数的存储过程CREATE PROCEDURE PR_Sum@a int,@b int,@sum int outputASBEGINset @sum=@a+@bEND--创建Return返回值存储过程CREATE PROCEDURE PR_Sum2@a int,@b intASBEGINReturn @a+@bEND--执行存储过程获取output型返回值declare @mysum intexecute PR_Sum 1,2,@mysum outputprint @mysum--执行存储过程获取Return型返回值declare @mysum2 intexecute @mysum2= PR_Sum2 1,2print @mysum2八、自定义函数函数的分类:1)标量值函数2)表值函数a:内联表值函数b:多语句表值函数3)系统函数--新建标量值函数create function FUNC_Sum1(@a int,@b int)returns intasbeginreturn @a+@bend--新建内联表值函数create function FUNC_UserTab_1(@myId int)returns tableasreturn (select * from ST_User where ID<@myId)--新建多语句表值函数create function FUNC_UserTab_2(@myId int)returns @t table([ID] [int] NOT NULL,[Oid] [int] NOT NULL,[Login] [nvarchar](50) NOT NULL,[Rtx] [nvarchar](4) NOT NULL,[Name] [nvarchar](5) NOT NULL,[Password] [nvarchar](max) NULL,[State] [nvarchar](8) NOT NULL)asbegininsert into @t select * from ST_User where ID<@myIdreturnend--调用表值函数select * from dbo.FUNC_UserTab_1(15)--调用标量值函数declare @s intset @s=dbo.FUNC_Sum1(100,50)print @s--删除标量值函数drop function FUNC_Sum1谈谈自定义函数与存储过程的区别:一、自定义函数:1. 可以返回表变量2. 限制颇多,包括不能使用output参数;不能用临时表;函数内部的操作不能影响到外部环境;不能通过select返回结果集;不能update,delete,数据库表;3. 必须return 一个标量值或表变量自定义函数一般用在复用度高,功能简单单一,争对性强的地方。二、存储过程1. 不能返回表变量2. 限制少,可以执行对数据库表的操作,可以返回数据集3. 可以return一个标量值,也可以省略return存储过程一般用在实现复杂的功能,数据操纵方面。
-- 创建测试user表create table user_test (user_id int identity(1,1) primary key,user_name varchar(20),user_price float,user_auth varchar(10));-- 插入测试数据insert into user_test(user_name,user_price,user_auth)values('论语',25.6,'孔子'),('天龙八部',25.6,'金庸'),('雪山飞狐',32.7,'金庸'),('平凡的世界',35.8,'路遥'),('史记',54.8,'司马迁');select * from user_test;*/-- 1.创建无参存储过程if (exists (select * from sys.objects where name = 'getAlluser'))drop procedure getAllusergocreate procedure getAlluserasbeginselect * from user_test;-- 调用,执行存储过程exec getAlluser;endgo-- 2、修改存储过程alter procedure getalluserasselect user_name from user_test;-- 3、删除存储过程drop procedure getalluser;go-- 4、修改存储过程的名称sp_rename getalluser,proc_get_alluser;goexec proc_get_alluser;go-- 5、创建带参数的存储过程use clowngoif (exists (select * from sys.objects where name = 'searchuser'))drop procedure searchuser-- exec searchuser 1;--执行存储searchuser得到如下结果:gocreate procedure searchuser (@userid int) -- 括号里面是asbegindeclare @user_id int;----定义一个标量变量,只是保证存储过程的完整性,在本存储是多此一举的。set @user_id = @userid;select* from user_test where user_id = @user_id;end;go-- exec searchuser 1;--执行存储searchuser得到如下结果:-- 6、创建带两个参数的存储过程use ssqadmgoif (exists (select * from sys.objects where name = 'user_test2'))drop procedure user_test2-- exec user_test2 1;--执行存储user_test2得到如下结果:gocreate procedure user_test2 (@userid int,@username varchar(20))--括号里面是asbegindeclare @user_id int; -- 定义一个标量变量,只是保证存储过程的完整性,在本存储是多此一举的。declare @user_name varchar(20);set @user_id = @userid;set @user_name = @username;select* from user_test where user_id = @user_id and user_name = @user_name;end;go-- exec user_test2 1,'论语';--执行存储user_test2得到如下结果:-- 7、创建带有返回值的存储过程use ssqadmgoif (exists (select * from sys.objects where name = 'user_test3'))drop procedure user_test3gocreate procedure user_test3(@userid int,@out_user_name varchar(20) output)asdeclare @user_id int;set @user_id = @userid;beginselect @out_user_name = user_name from user_test where user_id= @user_id;endgo-- --执行存储user_test2得到如下结果:-- 执行存储过程declare @out_name varchar(20) -- 声明一个变量用来接收执行存储过程后的返回值exec user_test3 1,@out_name outputselect @out_name as out_user_name;-- as是给返回的列值起一个名字
