MSSQL Transaction[事务] and Procedure[存储过程]

Posted DrHao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MSSQL Transaction[事务] and Procedure[存储过程]相关的知识,希望对你有一定的参考价值。

  1 --事务分三种
  2 --1.显示事务
  3 --我们手动begin transaction ...... commit transaction/rollback transaction
  4 --上面这种写法叫做“显示事务”
  5 
  6 --2.隐式事务
  7 SET IMPLICIT_TRANSACTIONS { ON | OFF }隐式事务
  8 
  9 
 10 --3.自动提交事务,SQL Server默认使用的是自动提交事务.
 11 --我们每次执行一条sql语句的时候,sql server都会自动帮我们打开一个事务
 12 --如果该sql语句执行不出错,则sql server自动提交该事务commit
 13 --如果该sql语句执行出错了,那么sql server则自动回滚该事务。rollback
 14 
 15 --1:创建第一个简单的存储过程 
 16  CREATE PROC usp_helloworld
 17  AS
 18  BEGIN
 19     PRINT hello world!
 20  END
 21  
 22  EXEC usp_helloworld
 23  
 24  --2:带参数的存储过程
 25 CREATE PROC usp_showmsg 
 26 @msg nvarchar(300)  ---多个参数使用,隔开。
 27 AS
 28 BEGIN
 29     PRINT @msg
 30 END
 31 
 32 
 33  EXEC usp_showmsg NXXX
 34  
 35  EXEC usp_showmsg @msg=N11111111111
 36  
 37  
 38  
 39  --3:简单的加法存储过程
 40  CREATE PROC usp_add
 41  @n int,
 42  @m int
 43  AS
 44  BEGIN
 45     PRINT @n+@m
 46  END
 47  
 48  EXEC usp_add 100,200
 49  
 50  DROP PROC usp_add
 51  
 52 --4:带默认值的存储过程
 53 ALTER PROC usp_add 
 54 @num1 int = 100,  --为参数加默认值
 55 @num2 int = 200
 56 AS
 57 BEGIN
 58     PRINT @num1 + @num2
 59 END
 60 
 61 
 62 
 63 --5:部分带默认值的存储过程
 64 ALTER PROC usp_add 
 65 @num1 int = 100,  --为参数加默认值
 66 @num2 int
 67 AS
 68 BEGIN
 69     PRINT @num1 + @num2
 70 END
 71 
 72 exec usp_add @num2=50
 73 
 74 --6:存储过程中的输出参数
 75 SELECT * FROM TblStudent
 76 
 77 ALTER PROC usp_selectByAge
 78 @age int,
 79 @count int OUTPUT  -- 输出参数
 80 AS
 81 BEGIN
 82     --1. 根据@age进行查询
 83     SELECT * FROM TblStudent where tSAge>@age
 84     
 85     --2.返回一共查询出了多少条数据
 86     SET @count=(SELECT COUNT(*) FROM TblStudent where tsage>@age)
 87 END
 88 
 89 
 90 DECLARE @c int
 91 EXEC usp_selectByAge @age=20,@count=@c OUTPUT
 92 PRINT @c
 93 
 94 
 95 --7:经典写法:转账使用存储过程来编写
 96 --存储过程
 97 CREATE PROC usp_transfer
 98 @from char(4),
 99 @to char(4),
100 @money money,
101 @state bit OUTPUT --1表示转账成功,0表示转账失败! 
102 AS
103 BEGIN
104     DECLARE @balance money,@sum int=0
105     SET @state=0
106     --1.查询@from中的余额
107     SET @balance=(SELECT balance FROM bank WHERE bank.cId=@from)
108     --2.检查余额是否充足
109     IF @balance-@money>10 BEGIN  
110         ----3.开始事务进行转账
111         --打开事务
112         BEGIN TRANSACTION
113             --1.减钱
114             UPDATE bank SET balance=bank.balance-@money where bank.cId=@from
115             SET @sum=@sum+@@error
116             --2.加钱
117             UPDATE bank SET balance=bank.balance+@money where bank.cId=@to
118             SET @sum=@sum+@@error
119             
120             IF @sum=0 BEGIN  
121                 SET @state=1 --设置转账成功
122                 COMMIT TRAN
123             END
124             ELSE
125                 ROLLBACK TRAN
126             
127     END
128 END
129 --调用存储过程
130 DECLARE @ok bit
131 EXEC usp_transfer @from=0002,@to=0001,@money=800,@state=@ok OUTPUT
132 SELECT @ok
133 
134 SELECT * FROM bank
135 
136 
137 
138 --8:经典:分页存储过程
139 SELECT * FROM Customers order by Customers.CustomerID asc
140 
141 --创建存储过程
142 --参数:
143     --每页大小pagesize
144     --当先用户要查看第几页 
145     --总页数
146     --总条数
147 CREATE PROC usp_get_customers_by_page
148 @pagesize int=5, --每页多少条
149 @pageindex int=1,  --用户当前要看第几页 
150 @recordcount int OUTPUT, --总记录条数,输出参数
151 @pagecont int OUTPUT     --总页数,输出参数 
152 AS
153 BEGIN
154     --1. 分页查询语句
155     SELECT
156         T.CustomerID,
157         T.CompanyName,
158         T.City,
159         T.[Address],
160         T.Phone
161     FROM (SELECT *,rn=ROW_NUMBER()OVER(ORDER by CustomerID ASC) FROM Customers) AS T
162     WHERE T.rn BETWEEN @pagesize*(@pageindex-1)+1 and @pagesize*@pageindex
163     
164     --2.返回总条数
165     SET @recordcount=(SELECT COUNT(*) FROM Customers)
166     
167     --3.计算总页数,并返回
168     SET @pagecont=CEILING(@recordcount*1.0/@pagesize);
169 END
170 
171 --调用存储过程
172 DECLARE @pc int,@rc int
173 EXEC usp_get_customers_by_page 7,13,@rc OUTPUT,@pc OUTPUT
174 PRINT @pc
175 PRINT @rc
176 
177 
178 
179 --9:增删改查:存储过程
180 --insert
181 CREATE PROC usp_insert_newperson
182 @name nvarchar(50),
183 @age int
184 AS
185 BEGIN
186     INSERT into NewPerson VALUES(@name,@age)
187 END
188 ------------------------------
189 --delete
190 CREATE PROC usp_delete_newperson
191 @autoId int
192 AS
193 BEGIN
194     DELETE from NewPerson where NewPerson.autoId=@autoId
195 END
196 ------------------------------
197 --update
198 CREATE PROC usp_update_newperson
199 @autoId int,
200 @name nvarchar(50),
201 @age int
202 AS
203 BEGIN
204     UPDATE NewPerson set uName=@name,age=@age WHERE NewPerson.autoId=@autoId
205 END
206 ---------------------------------------
207 --select
208 CREATE PROC usp_select_newperson
209 AS
210 BEGIN
211     SELECT * FROM NewPerson
212 END
213 -------------------------------------
214 CREATE view vw_newperson
215 AS 
216     SELECT * FROM NewPerson
217     
218     
219 --10:其它-----
220 SELECT * FROM Contacts
221 SELECT * FROM deleted
222     
223 INSERT into NewPerson (NewPerson.uName,age) 
224 OUTPUT INSERTED.autoId  VALUES(王子斌,20)
225 
226 ----inserted-------------------    deleted-----------------------
227 
228 SELECT * FROM Customers
229 
230 DELETE from Customers where Customers.CustomerID=CHOPS
231 
232 
233 SELECT TOP 0 * INTO CustomersBak FROM Customers
234 
235 SELECT * FROM CustomersBak
236 
237 ALTER TRIGGER tri_customers_after_delete ON Customers
238 AFTER DELETE
239 AS
240 BEGIN
241     INSERT INTO CustomersBak SELECT * FROM DELETED
242 END
243 
244 SELECT * FROM Customers
245 
246 
247 DELETE from Customers where Customers.CustomerID IN(CACTU,CENTC,ERNSH)
248 
249 
250 
251 CREATE TABLE A20140222 ( A VARCHAR(10))
252 
253 
254 DECLARE @SQL varchar(500)
255 SET @SQL=CREATE TABLE T_+CONVERT(VARCHAR(10),GETDATE(),112)+ ( A VARCHAR(10))
256 PRINT @SQL
257 EXEC(@SQL )
258 
259 PRINT CONVERT(VARCHAR(10),GETDATE(),112)
260 
261 
262 
263 
264 
265  

 

以上是关于MSSQL Transaction[事务] and Procedure[存储过程]的主要内容,如果未能解决你的问题,请参考以下文章

PHP 需要引号才能在 SQL Server 数据库中使用“事务”表

START TRANSACTION inside BEGIN ... END context or outside and LOOP 语法

Java事务以及嵌套事务

Spring 事务Transaction源码深度解析

MySQL数据库(27):事务安全 transaction

ABORT