|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