放到一个事物里面 1)放在一个try~catch里面 alter PROCEDURE [dbo].[dd] AS BEGIN begin try begin tran insert into student values('new111111111111111111111111111','1',2,'23',3,getdate()) insert into person values('new21312',5,'45') commit tran end try begin catch print 'a' rollback tran end catch end2)set xact_abord on有错误发生时,整个自动回滚ALTER PROCEDURE [dbo].[dd2] AS BEGIN begin tran
SET XACT_ABORT on insert into person values('n',5,'45') insert into student values('new111111111111111111111111111123','1',2,'23',3,getdate()) commit tran end
謝謝你的回復,但我試過了還是不可以,是不是我SQL是2000的問題?
不是存儲過程,而是想要在執行完一條SQL命令後想知道它是否執行成功。
create table _t(nf nvarchar(10),name nvarchar(10),tmp float) go create proc test as begin tran insert into _t select '','',1.0 insert into _t select '','',',' if @@ERROR <>0 begin rollback tran return end commit tran goexec test /* (1 row(s) affected) Msg 8114, Level 16, State 5, Procedure test, Line 5 Error converting data type varchar to float. */ select * from _t /* nf name tmp ---------- ---------- ----------------------(0 row(s) affected) */ drop table _t drop proc test
是这个意思??create procedure proc_test as begin begin try insert tb values('值1') if @@Error <> 0 goto aa; insert tb values('值2') if @@Error <> 0 goto aa; insert tb values('值3') if @@Error <> 0 goto aa; END TRY begin catch aa: RAISERROR ('错误',16, 1) rollback tran END Catch end
謝謝,但是在begin tran insert into _t select '','',1.0 insert into _t select '','',',' print(@error)--這裡好像沒有值,也就是說好像沒有執行。 if @@ERROR <>0 begin rollback tran return end commit tran
select @a=@@errors print @a 先看下错误内容
謝謝,但是根本不執行select @a=@@errors ,也就取不到值.
--1.Try...Catch.. BEGIN TRY create table _t(nf nvarchar(50),name nvarchar(50),tmp float) insert into _t select '','',',' END TRY BEGIN CATCH IF @@ERROR<>0 PRINT('错误') END CATCH --TRY...CATCH 构造捕捉所有严重级别大于 10 但不终止数据库连接的错误。--2.分开批次 create table _t( nf nvarchar(50), name nvarchar(50), tmp float)
insert into _t select '','',',' go IF @@ERROR<>0 PRINT('错误')
ALTER PROCEDURE [dbo].[spReceiveDyeingForeign] @Contract_No varchar(10) ,@sReceiver varchar(10) ,@Msg varchar(100) output AS set Xact_ABORT ON begin tran insert into _t select '','',1.0 insert into _t select '','',',' if @@error<>0 begin SET @Msg = '此操作出错' end end if @Msg<>'' begin SET @Msg = 'OK' end set Xact_ABORT OFF RETURN
begin try end try 是2005的用法,可以扑捉任何错误楼主是SQL2000,@@ERROR是根据错误级别来判断的,错误级别不同,有可能扑捉不到错误的参考如下贴:http://topic.csdn.net/u/20090326/22/f81549e2-9ef3-454a-b6fc-1c1f23390c01.html
遇到过类似的问题 后来改变了下思路 在插入的时候同时做条件限制,如: insert into _t select 1,2,3 where F1(假设F1为主键)=1 再接着判断 @@rowcount 如果为0 插入失败 如果为1 插入成功
你的SQL是2005吗?
你可以用Try....Catch....
Begin Try
create table _t(nf nvarchar(50),name nvarchar(50),tmp float)
insert into _t select '','',','
END TRY
Begin Catch
print N'错误'
END Catch
其實想要的是不管什麼錯誤都能提示出來。
难道你的存储一定会出现这种问题吗?
其实你可以用@@rowcount
如果没有受影响的行,则说明没有插进去。
1)放在一个try~catch里面
alter PROCEDURE [dbo].[dd]
AS
BEGIN
begin try
begin tran
insert into student values('new111111111111111111111111111','1',2,'23',3,getdate())
insert into person values('new21312',5,'45')
commit tran
end try
begin catch
print 'a'
rollback tran
end catch
end2)set xact_abord on有错误发生时,整个自动回滚ALTER PROCEDURE [dbo].[dd2]
AS
BEGIN
begin tran
SET XACT_ABORT on
insert into person values('n',5,'45')
insert into student values('new111111111111111111111111111123','1',2,'23',3,getdate()) commit tran
end
go
create proc test
as
begin tran
insert into _t select '','',1.0
insert into _t select '','',','
if @@ERROR <>0
begin
rollback tran
return
end
commit tran
goexec test
/*
(1 row(s) affected)
Msg 8114, Level 16, State 5, Procedure test, Line 5
Error converting data type varchar to float.
*/
select * from _t
/*
nf name tmp
---------- ---------- ----------------------(0 row(s) affected)
*/
drop table _t
drop proc test
是这个意思??create procedure proc_test
as
begin
begin try
insert tb values('值1')
if @@Error <> 0
goto aa;
insert tb values('值2')
if @@Error <> 0
goto aa;
insert tb values('值3')
if @@Error <> 0
goto aa;
END TRY
begin catch
aa:
RAISERROR ('错误',16, 1)
rollback tran
END Catch
end
insert into _t select '','',1.0
insert into _t select '','',','
print(@error)--這裡好像沒有值,也就是說好像沒有執行。
if @@ERROR <>0
begin
rollback tran
return
end
commit tran
print @a
先看下错误内容
BEGIN TRY
create table _t(nf nvarchar(50),name nvarchar(50),tmp float)
insert into _t select '','',','
END TRY
BEGIN CATCH
IF @@ERROR<>0
PRINT('错误')
END CATCH
--TRY...CATCH 构造捕捉所有严重级别大于 10 但不终止数据库连接的错误。--2.分开批次
create table _t(
nf nvarchar(50),
name nvarchar(50),
tmp float)
insert into _t select '','',','
go
IF @@ERROR<>0
PRINT('错误')
然后参考
http://topic.csdn.net/u/20090326/22/f81549e2-9ef3-454a-b6fc-1c1f23390c01.html
@Contract_No varchar(10)
,@sReceiver varchar(10)
,@Msg varchar(100) output
AS
set Xact_ABORT ON
begin tran
insert into _t select '','',1.0
insert into _t select '','',',' if @@error<>0
begin
SET @Msg = '此操作出错'
end
end
if @Msg<>''
begin
SET @Msg = 'OK'
end
set Xact_ABORT OFF
RETURN
end try 是2005的用法,可以扑捉任何错误楼主是SQL2000,@@ERROR是根据错误级别来判断的,错误级别不同,有可能扑捉不到错误的参考如下贴:http://topic.csdn.net/u/20090326/22/f81549e2-9ef3-454a-b6fc-1c1f23390c01.html
后来改变了下思路
在插入的时候同时做条件限制,如:
insert into _t select 1,2,3 where F1(假设F1为主键)=1
再接着判断 @@rowcount
如果为0 插入失败
如果为1 插入成功