在T-SQL 中编写事务

-- T-SQL 中编写事务
-- 使用Northwind 数据库
1、先创建一个存储过程
create procedure up_trans_test
  @newcustid nchar(5 ),
  @newcompname nvarchar(40 ),
  @oldcustid nchar(5 )
as
  declare @inserr int
  declare @delerr int
  declare @maxerr int

  set @maxerr = 0
  --事务开始
  begin transaction
  -- 添加客户
  insert into customers (customerid , companyname )
  values( @newcustid, @newcompname)
  -- 保存从 insert语句中返回的错误次数
  set @inserr = @@error
  if @inserr > @maxerr
             set @maxerr = @inserr
 
  --删除客户
  delete from customers where customerid = @oldcustid
  --保存从 delete语句中返回的错误次数
  set @delerr = @@error
  if @delerr > @maxerr
    set @maxerr = @delerr
 
  --如果发生错误,则回滚事务
  if @maxerr <> 0
  begin
    rollback
             print 'Transaction rolled back'
  end
  else
  begin
    commit
             print 'Transaction committed'
  end
  print 'INSERT error number: ' + cast( @inserr as nvarchar( 8))
  print 'DELETE error number: ' + cast( @delerr as nvarchar( 8))
  return @maxerr

2、执行以下查询
exec up_trans_test 'a ', 'a ', 'z '
结果如下:
(1 行受影响)

(0 行受影响)
Transaction committed
INSERT error number: 0
DELETE error number: 0

3、查看结果
select * from customers
CustomerID
CompanyName
ContactName
...
a   
a
NULL
...

4、添加另一个客户
exec up_trans_test 'aa' , 'aa', 'z '
(1 行受影响 )

(0 行受影响)
Transaction committed
INSERT error number: 0
DELETE error number: 0

5、查看结果
select * from customers
CustomerID
CompanyName
ContactName
a   
a
NULL
aa  
aa
NULL

6、尝试插入重复的客户a,并且删除一个已有客户aa
exec up_trans_test 'a', 'a ', 'aa'
结果:
消息 2627,级别 14,状态 1,过程 up_trans_test,第 14 
违反了 PRIMARY KEY 约束 ?PK_Customers?。不能在对象?dbo.Customers?中插入重复键。重复键值为 (a    )
语句已终止。

(1 行受影响)
Transaction rolled back
INSERT error number: 2627
DELETE error number: 0

7、插入一个有效的新客户aaa,并尝试删除一个在Orders表中有子记录的客户ALFKI
exec up_trans_test 'aaa', 'aaa ', 'ALFKI'
(1 行受影响)
消息 547,级别 16,状态 0,过程 up_trans_test,第 22 
DELETE 语句与 REFERENCE 约束"FK_Orders_Customers"冲突。该冲突发生于数据库 "Northwind",表"dbo.Orders", column 'CustomerID' 
语句已终止。
Transaction rolled back
INSERT error number: 0
DELETE error number: 547

8、尝试插入无效的新客户a ,并删除不可删除的客户ALFKI
exec up_trans_test 'a ', 'a ', 'ALFKI'
消息 2627,级别 14,状态 1,过程 up_trans_test,第 14 
违反了 PRIMARY KEY 约束 ?PK_Customers?。不能在对象?dbo.Customers?中插入重复键。重复键值为 (a    )
语句已终止。
消息 547,级别 16,状态 0,过程 up_trans_test,第 22 
DELETE 语句与 REFERENCE 约束"FK_Orders_Customers"冲突。该冲突发生于数据库 "Northwind",表"dbo.Orders", column 'CustomerID' 
语句已终止。
Transaction rolled back
INSERT error number: 2627
DELETE error number: 547

  

你可能感兴趣的:(C#,DB)