|M| 一条比较复杂的触发器 接分 我翻了一下午的SQL书都写不出 高手一下就解决了 呵呵
来接分 
 为了必免是送分贴 
 问一点问题: 
 我SQL语法不太明这里问一下 
 BEGIN   TRANSACTION 
 ROLLBACK 
 COMMIT   TRANSACTION 
 是什么意思   
 BEGIN   TRANSACTION      事务开始? 
 ROLLBACK      退出事务? 
 COMMIT   TRANSACTION      执行事务?
------解决方案--------------------BEGIN TRANSACTION  事务开始? 
 ROLLBACK  退出事务?           --這個是回滾 
 COMMIT TRANSACTION  执行事务? --這個是事务   
------解决方案--------------------BEGIN TRANSACTION  事务开始? 
 ROLLBACK  退出事务?  -----这个是回滚 
 COMMIT TRANSACTION  执行事务?
------解决方案--------------------一般,使用事务前,设置Set Xact_abort on使得事务内任一SQL出错整个事务都回滚。     
 BEGIN TRANSACTION  事务开始     
 ROLLBACK  回滚事务     
 COMMIT TRANSACTION  提交事务
------解决方案--------------------BEGIN TRANSACTION 
 標記明確的本機交易的起點。BEGIN TRANSACTION 會以 1 遞增 @@TRANCOUNT。     
 ROLLBACK TRANSACTION 
 將外顯或隱含的交易復原至交易的開頭,或復原至交易中的安全點。   
 COMMIT TRANSACTION 
 標示成功的隱含或使用者自訂交易的結尾。如果 @@TRANCOUNT 為 1,則 COMMIT TRANSACTION 自交易開始就會使執行的所有資料修改成為資料庫的永久部份、釋出連線所保存的資源,並使 @@TRANCOUNT 遞減至零。如果 @@TRANCOUNT 大於 1,則 COMMIT TRANSACTION 只會使 @@TRANCOUNT 減 1。   
------解决方案--------------------if object_id( 'tbUser ') is not null 
 drop table tbUser 
 if object_id( 'tbSMS ') is not null 
 drop table tbSMS 
 GO 
 create table tbUser(ID int,Name varchar(10), Age int, Address varchar(20),Tel varchar(20)) 
 create table tbSMS(ID int identity(1,1), UserID int, Connect varchar(70),Send bit) 
 GO 
 ----创建INSERT触发器 
 create trigger trg_insert_tbUser on tbUser 
 for insert  
 as 
 declare @id int,@str varchar(1000) 
 set @str =  ' ' 
 SELECT @id = ID, @str = Name +  
  ',在我们的网站的ID号为 ' + right(100000 + @id,5) +  ',今年 ' +  
 rtrim(Age) +  '岁,所在地 ' + Address +  ',电话是 ' + Tel 
 FROM inserted 
 BEGIN TRANSACTION  --事务开始 
 WHILE len(@str) >  0 
 begin 
     insert tbSMS (UserID,Connect,Send) select @id,substring(@str,1,30),0 
     IF @@error  <>  0 
     begin 
         ROLLBACK   --如果遇到错误则回滚,取消之前的插入 
         RETURN     --遇到错误立即结束触发器,不执行后面的语句 
     end 
     set @str = stuff(@str,1,30, ' ') 
 end 
 COMMIT TRANSACTION --如果未遇到错误则提交事务,保存插入 
 GO   
 ----测试 
 insert tbUser select 2,    '小王 ', 21,   '广州越秀 ',    '020-8731**** '  
 insert tbUser select 112,  '小李 ', 24,   '广州天河北 ',  '020-35684*** ' 
 ----查看 
 SELECT * FROM tbSMS   
 ----清除测试环境 
 drop table tbUser,tbSMS   
 /*结果 
 ID  UserID  Connect                                          Send  
 -------------------------------- 
 1     2       小王,在我们的网站的ID号为00002,今年21岁,所在地广 0 
 2     2       州越秀,电话是020-8731****                        0 
 3     112     小李,在我们的网站的ID号为00112,今年24岁,所在地广 0 
 4     112     州天河北,电话是020-35684***                      0 
 */ 
------解决方案--------------------刚才那贴测试过吗   
 在触发器中加BEGIN TRANSACTION好像有点问题的   
------解决方案--------------------就这还翻了一下午的SQL书???? 
 ROLLBACK就是回到事务执行前的状态,不是重新来一次 
------解决方案--------------------检测触发器遇到插入错误时是否会回滚: 
 if object_id( 'tbUser ') is not null