我在C#应用程序中使用SQL Server,我正在使用批处理语句。我遇到的问题是在语句失败的情况下,无论出于何种原因,我需要知道哪个语句失败并返回它。
我设法做了这个,我在SQL语句周围放了一个try catch
(所以如果它失败就不会退出)然后C#cmd.ExecuteQuery
返回受影响的行数。
我现在遇到的问题是,如果由于触发器而发生故障,则触发器位于原始批次的try catch
之外,因此不会被捕获,但会被捕获由C#应用程序。此时,批次的状态在边缘丢失,整个事情都失败了。
我需要一些方法来了解哪个语句(或到目前为止受影响的行数,或批处理中的索引)触发了导致异常的触发器。无论我在SQL还是C#中都可以做些什么,我都愿意接受。
感谢。
答案 0 :(得分:1)
这不是一个答案,但它对评论来说太大了,需要格式化。
说我有一个声明,例如BEGIN TRY INSERT INTO JAZZHANDS VALUES(2)END TRY BEGIN CATCH END CATCH。如果表JAZZHANDS具有在其他表中插入任何内容的触发器,则如果该触发器失败,则它将不会循环返回并从原始插入中捕获到CATCH中。交易完全失败
我不知道你为什么这么认为。以下SQL:
create table JazzHands (ID int not null,constraint CK_ID_JH CHECK (ID < 10))
go
create table JazzHands2 (ID int not null,constraint CK_ID_JH2 CHECK (ID < 5))
go
create trigger T_JazzHands on JazzHands after insert
as
insert into JazzHands2(ID)
select ID from inserted
go
--1
begin try
insert into JazzHands (ID) values (11)
PRINT 'No error 1'
end try
begin catch
Print 'error 1'
end catch
go
--2
begin try
insert into JazzHands (ID) values (6)
PRINT 'No error 2'
end try
begin catch
Print 'error 2'
end catch
go
--3
begin try
insert into JazzHands (ID) values (1)
PRINT 'No error 3'
end try
begin catch
Print 'error 3'
end catch
go
产地:
(0 row(s) affected)
error 1
(0 row(s) affected)
(0 row(s) affected)
error 2
(1 row(s) affected)
(1 row(s) affected)
No error 3
两个表都包含一行。这与您的断言相反,当表中的某些内容阻止插入成功,或者表中的触发器内的某些内容阻止插入成功时,发生完全相同的错误处理,它通常难以区分。
如果您确实有一个实际示例,其中触发器的失败产生的行为与直接在桌面上失败的行为不同,请在您的问题中编辑这样的示例。
答案 1 :(得分:0)
你要找的是最后一句话,对吧?您可以通过调用DBCC INPUTBUFFER
从触发器内部获取此信息。
另请参阅这是否有帮助:
SELECT session_id, TEXT
FROM sys.dm_exec_connections
CROSS APPLY sys.dm_exec_sql_text(most_recent_sql_handle) AS ST