gpt4 book ai didi

sql-server - SQL Server try-catch 内部异常消息难题

转载 作者:行者123 更新时间:2023-12-02 22:23:13 26 4
gpt4 key购买 nike

下面的 SQL 语句是一些抛出带有嵌套详细信息的异常的 SQL 的一个很好的示例。看来在语句的 catch 部分我只能获取外部异常详细信息 无法创建约束。查看以前的错误(不是很有用!)。我想要得到的是内部异常消息:

Introducing FOREIGN KEY constraint 'FK_TWO' on table 'TABLE2' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints (you can get this message by running the code without try-catch).

在 Catch block 中,如何在 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;

[编辑]

经过一番查找,这个问题似乎没有解决办法。希望他们能在未来的版本中解决这个问题。

最佳答案

您无法重新抛出原始错误。您必须抛出一个错误,错误号大于50000,其中包含捕获的错误消息。请参阅Exception handling and nested transactions举个例子:

begin catch
declare @error int, @message varchar(4000), @xstate int;
select @error = ERROR_NUMBER()
, @message = ERROR_MESSAGE();
raiserror ('Caught exception: %d: %s', 16, 1, @error, @message) ;
return;
end catch

我链接的文章有一个更全面的示例,还涵盖了强制的 XACT_STATE() 检查以及将 try/catch block 与事务语义混合。

在下一个版本(“Denali”)中,此问题已得到解决,因为您可以发出不带任何参数的 throw; ,这将像其他 try 一样引发原始异常/捕获语言。请参阅TRY CATCH THROW: Error handling changes in T-SQL

已更新

哦,我是用对角线阅读这篇文章的。如果引发更多异常,则只能捕获一个。这仍然是事实,对于麦金利峰来说也是如此。但大多数情况下,引发的异常严重性为 0(意味着它们实际上是打印,而不是异常),并且这些异常仍然作为信息性消息(SqlConnection.InfoMessage 事件)发送给客户端。

关于sql-server - SQL Server try-catch 内部异常消息难题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4349829/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com