【发布时间】:2010-12-03 21:00:17
【问题描述】:
下面的 SQL 语句是一些抛出带有嵌套详细信息的异常的 SQL 的一个很好的示例。似乎在语句的 catch 部分中,我只能获取外部异常详细信息Could not create constraint. See previous errors(不是很有用!)。我想得到的是内部异常消息:
引入 FOREIGN KEY 约束 表 'TABLE2' 上的 'FK_TWO' 可能会导致 循环或多个级联路径。 指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束(你可以得到 此消息通过运行代码 没有 try-catch)。
在 Catch 块中,如何在 T-SQL 中实现?
BEGIN TRY
BEGIN TRAN;
CREATE TABLE TABLE1 (USER_ID INTEGER NOT NULL PRIMARY KEY, USER_NAME
CHAR(50) NOT NULL);
CREATE TABLE TABLE2 (AUTHOR_ID INTEGER NOT NULL PRIMARY KEY, AUTHOR_NAME
CHAR(50) NOT NULL, LASTMODIFIEDBY INTEGER NOT NULL, ADDEDBY INTEGER NOT
NULL);
ALTER TABLE TABLE2 ADD CONSTRAINT FK_ONE FOREIGN KEY (LASTMODIFIEDBY)
REFERENCES TABLE1 (USER_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE TABLE2 ADD CONSTRAINT FK_TWO FOREIGN KEY (ADDEDBY)
REFERENCES TABLE1(USER_ID) ON DELETE NO ACTION ON UPDATE CASCADE;
COMMIT TRAN;
END TRY
BEGIN CATCH
DECLARE @ERROR_MSG NVARCHAR(MAX), @SEVERITY INT, @STATE INT
SELECT @SEVERITY = ERROR_SEVERITY(), @STATE = ERROR_STATE()
, @ERROR_MSG = ERROR_MESSAGE() + ' err src line: ' + CAST( ERROR_LINE() AS NVARCHAR(20)) + ' ' + ISNULL(ERROR_PROCEDURE(), '');
ROLLBACK;
-- RE-THROW EXCEPTION FOR DIAGNOSTIC VISIBILITY
RAISERROR (@ERROR_MSG ,@SEVERITY, @STATE);
END CATCH;
[编辑]
因此,经过大量搜索,似乎没有解决此问题的方法。希望他们能在未来的版本中解决这个问题。
【问题讨论】:
-
我认为没有任何方法可以做到这一点。另请参阅此相关问题:Capturing multiple error messages from a single statement
标签: sql-server tsql exception-handling try-catch