sql server存储过程的优点

    1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
    2.当对数据库进行复杂操作时(如对多个表进行 Update,Insert,Query,Delete 时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。这些操作,如果用程序来完成,就变成了一条条的 SQL 语句,可能要多次连接数据库。而换成存储,只需要连接一次数据库就可以了。
    3.存储过程可以重复使用,可减少数据库开发人员的工作量。
    4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权。

    1. 一、定义变量
    2. --简单赋值
    3. declare @a int
    4. set @a=5
    5. print @a
    6. --使用select语句赋值
    7. declare @user1 nvarchar(50)
    8. select @user1='张三'
    9. print @user1
    10. declare @user2 nvarchar(50)
    11. select @user2 = Name from ST_User where ID=1
    12. print @user2
    13. --使用update语句赋值
    14. declare @user3 nvarchar(50)
    15. update ST_User set @user3 = Name where ID=1
    16. print @user3
    17. 二、表、临时表、表变量
    18. --创建临时表1
    19. create table #DU_User1
    20. (
    21. [ID] [int] NOT NULL,
    22. [Oid] [int] NOT NULL,
    23. [Login] [nvarchar](50) NOT NULL,
    24. [Rtx] [nvarchar](4) NOT NULL,
    25. [Name] [nvarchar](5) NOT NULL,
    26. [Password] [nvarchar](max) NULL,
    27. [State] [nvarchar](8) NOT NULL
    28. );
    29. --向临时表1插入一条记录
    30. insert into #DU_User1 (ID,Oid,[Login],Rtx,Name,[Password],State) values (100,2,'LS','0000','临时','321','特殊');
    31. --从ST_User查询数据,填充至新生成的临时表
    32. select * into #DU_User2 from ST_User where ID<8
    33. --查询并联合两临时表
    34. select * from #DU_User2 where ID<3 union select * from #DU_User1
    35. --删除两临时表
    36. drop table #DU_User1
    37. drop table #DU_User2
    38. --创建临时表
    39. CREATE TABLE #t
    40. (
    41. [ID] [int] NOT NULL,
    42. [Oid] [int] NOT NULL,
    43. [Login] [nvarchar](50) NOT NULL,
    44. [Rtx] [nvarchar](4) NOT NULL,
    45. [Name] [nvarchar](5) NOT NULL,
    46. [Password] [nvarchar](max) NULL,
    47. [State] [nvarchar](8) NOT NULL,
    48. )
    49. --将查询结果集(多条数据)插入临时表
    50. insert into #t select * from ST_User
    51. --不能这样插入 (这样是获取结果集并创建临时表#t
    52. --select * into #t from dbo.ST_User
    53. --添加一列,为int型自增长子段
    54. alter table #t add [myid] int NOT NULL IDENTITY(1,1)
    55. --添加一列,默认填充唯一标识
    56. alter table #t add [myid1] uniqueidentifier NOT NULL default(newid())
    57. select * from #t
    58. drop table #t
    59. --给查询结果集增加自增长列
    60. --无主键时:
    61. select IDENTITY(int,1,1)as ID, Name,[Login],[Password] into #t from ST_User
    62. select * from #t
    63. --有主键时:
    64. select (select SUM(1) from ST_User where ID<= a.ID) as myID,* from ST_User a order by myID
    65. --定义表变量
    66. declare @t table
    67. (
    68. id int not null,
    69. msg nvarchar(50) null
    70. )
    71. insert into @t values(1,'1')
    72. insert into @t values(2,'2')
    73. select * from @t
    74. 三、循环
    75. --while循环计算1100的和
    76. declare @a int
    77. declare @sum int
    78. set @a=1
    79. set @sum=0
    80. while @a<=100
    81. begin
    82. set @sum+=@a
    83. set @a+=1
    84. end
    85. print @sum
    86. 四、条件语句
    87. --if,else条件分支
    88. if(1+1=2)
    89. begin
    90. print '对'
    91. end
    92. else
    93. begin
    94. print '错'
    95. end
    96. --when then条件分支
    97. declare @today int
    98. declare @week nvarchar(3)
    99. set @today=3
    100. set @week=case
    101. when @today=1 then '星期一'
    102. when @today=2 then '星期二'
    103. when @today=3 then '星期三'
    104. when @today=4 then '星期四'
    105. when @today=5 then '星期五'
    106. when @today=6 then '星期六'
    107. when @today=7 then '星期日'
    108. else '值错误'
    109. end
    110. print @week
    111. 五、游标
    112. declare @ID int
    113. declare @Oid int
    114. declare @Login varchar(50)
    115. --定义一个游标
    116. declare user_cur cursor for select ID,Oid,[Login] from ST_User
    117. --打开游标
    118. open user_cur
    119. while @@fetch_status=0
    120. begin
    121. --读取游标
    122. fetch next from user_cur into @ID,@Oid,@Login
    123. print @ID
    124. --print @Login
    125. end
    126. close user_cur
    127. --摧毁游标
    128. deallocate user_cur
    129. 六、触发器
    130.   触发器中的临时表:
    131.   Inserted
    132.   存放进行insertupdate 操作后的数据
    133.   Deleted
    134.   存放进行delete update操作前的数据
    135. --创建触发器
    136. Create trigger User_OnUpdate
    137. On ST_User
    138. for Update
    139. As
    140. declare @msg nvarchar(50)
    141. --@msg记录修改情况
    142. select @msg = N'姓名从“' + Deleted.Name + N'”修改为“' + Inserted.Name + '”' from Inserted,Deleted
    143. --插入日志表
    144. insert into [LOG](MSG)values(@msg)
    145. --删除触发器
    146. drop trigger User_OnUpdate
    147. 七、存储过程
    148. --创建带output参数的存储过程
    149. CREATE PROCEDURE PR_Sum
    150. @a int,
    151. @b int,
    152. @sum int output
    153. AS
    154. BEGIN
    155. set @sum=@a+@b
    156. END
    157. --创建Return返回值存储过程
    158. CREATE PROCEDURE PR_Sum2
    159. @a int,
    160. @b int
    161. AS
    162. BEGIN
    163. Return @a+@b
    164. END
    165. --执行存储过程获取output型返回值
    166. declare @mysum int
    167. execute PR_Sum 1,2,@mysum output
    168. print @mysum
    169. --执行存储过程获取Return型返回值
    170. declare @mysum2 int
    171. execute @mysum2= PR_Sum2 1,2
    172. print @mysum2
    173. 八、自定义函数
    174.   函数的分类:
    175.     1)标量值函数
    176.     2)表值函数
    177.         a:内联表值函数
    178.         b:多语句表值函数
    179.     3)系统函数
    180.   
    181. --新建标量值函数
    182. create function FUNC_Sum1
    183. (
    184. @a int,
    185. @b int
    186. )
    187. returns int
    188. as
    189. begin
    190. return @a+@b
    191. end
    192. --新建内联表值函数
    193. create function FUNC_UserTab_1
    194. (
    195. @myId int
    196. )
    197. returns table
    198. as
    199. return (select * from ST_User where ID<@myId)
    200. --新建多语句表值函数
    201. create function FUNC_UserTab_2
    202. (
    203. @myId int
    204. )
    205. returns @t table
    206. (
    207. [ID] [int] NOT NULL,
    208. [Oid] [int] NOT NULL,
    209. [Login] [nvarchar](50) NOT NULL,
    210. [Rtx] [nvarchar](4) NOT NULL,
    211. [Name] [nvarchar](5) NOT NULL,
    212. [Password] [nvarchar](max) NULL,
    213. [State] [nvarchar](8) NOT NULL
    214. )
    215. as
    216. begin
    217. insert into @t select * from ST_User where ID<@myId
    218. return
    219. end
    220. --调用表值函数
    221. select * from dbo.FUNC_UserTab_1(15)
    222. --调用标量值函数
    223. declare @s int
    224. set @s=dbo.FUNC_Sum1(100,50)
    225. print @s
    226. --删除标量值函数
    227. drop function FUNC_Sum1
    228. 谈谈自定义函数与存储过程的区别:
    229. 一、自定义函数:
    230.   1. 可以返回表变量
    231.   2. 限制颇多,包括
    232.     不能使用output参数;
    233.     不能用临时表;
    234.     函数内部的操作不能影响到外部环境;
    235.     不能通过select返回结果集;
    236.     不能updatedelete,数据库表;
    237.   3. 必须return 一个标量值或表变量
    238.   自定义函数一般用在复用度高,功能简单单一,争对性强的地方。
    239. 二、存储过程
    240.   1. 不能返回表变量
    241.   2. 限制少,可以执行对数据库表的操作,可以返回数据集
    242.   3. 可以return一个标量值,也可以省略return
    243.    存储过程一般用在实现复杂的功能,数据操纵方面。


    1. -- 创建测试user
    2. create table user_test (
    3. user_id int identity(1,1) primary key,
    4. user_name varchar(20),
    5. user_price float,
    6. user_auth varchar(10)
    7. );
    8. -- 插入测试数据
    9. insert into user_test
    10. (user_name,user_price,user_auth)
    11. values
    12. ('论语',25.6,'孔子'),
    13. ('天龙八部',25.6,'金庸'),
    14. ('雪山飞狐',32.7,'金庸'),
    15. ('平凡的世界',35.8,'路遥'),
    16. ('史记',54.8,'司马迁');
    17. select * from user_test;
    18. */
    19. -- 1.创建无参存储过程
    20. if (exists (select * from sys.objects where name = 'getAlluser'))
    21. drop procedure getAlluser
    22. go
    23. create procedure getAlluser
    24. as
    25. begin
    26. select * from user_test;
    27. -- 调用,执行存储过程
    28. exec getAlluser;
    29. end
    30. go
    31. -- 2、修改存储过程
    32. alter procedure getalluser
    33. as
    34. select user_name from user_test;
    35. -- 3、删除存储过程
    36. drop procedure getalluser;
    37. go
    38. -- 4、修改存储过程的名称
    39. sp_rename getalluser,proc_get_alluser;
    40. go
    41. exec proc_get_alluser;
    42. go
    43. -- 5、创建带参数的存储过程
    44. use clown
    45. go
    46. if (exists (select * from sys.objects where name = 'searchuser'))
    47. drop procedure searchuser
    48. -- exec searchuser 1;--执行存储searchuser得到如下结果:
    49. go
    50. create procedure searchuser (@userid int) -- 括号里面是
    51. as
    52. begin
    53. declare @user_id int;----定义一个标量变量,只是保证存储过程的完整性,在本存储是多此一举的。
    54. set @user_id = @userid;
    55. select* from user_test where user_id = @user_id;
    56. end;
    57. go
    58. -- exec searchuser 1;--执行存储searchuser得到如下结果:
    59. -- 6、创建带两个参数的存储过程
    60. use ssqadm
    61. go
    62. if (exists (select * from sys.objects where name = 'user_test2'))
    63. drop procedure user_test2
    64. -- exec user_test2 1;--执行存储user_test2得到如下结果:
    65. go
    66. create procedure user_test2 (@userid int,@username varchar(20))--括号里面是
    67. as
    68. begin
    69. declare @user_id int; -- 定义一个标量变量,只是保证存储过程的完整性,在本存储是多此一举的。
    70. declare @user_name varchar(20);
    71. set @user_id = @userid;
    72. set @user_name = @username;
    73. select* from user_test where user_id = @user_id and user_name = @user_name;
    74. end;
    75. go
    76. -- exec user_test2 1,'论语';--执行存储user_test2得到如下结果:
    77. -- 7、创建带有返回值的存储过程
    78. use ssqadm
    79. go
    80. if (exists (select * from sys.objects where name = 'user_test3'))
    81. drop procedure user_test3
    82. go
    83. create procedure user_test3(@userid int,@out_user_name varchar(20) output)
    84. as
    85. declare @user_id int;
    86. set @user_id = @userid;
    87. begin
    88. select @out_user_name = user_name from user_test where user_id= @user_id;
    89. end
    90. go
    91. -- --执行存储user_test2得到如下结果:
    92. -- 执行存储过程
    93. declare @out_name varchar(20) -- 声明一个变量用来接收执行存储过程后的返回值
    94. exec user_test3 1,@out_name output
    95. select @out_name as out_user_name;-- as是给返回的列值起一个名字