次のSQL文は、ネストされた詳細で例外をスローするSQLの良い例です。私は外側の例外の詳細Could not create constraint. See previous errors
(非常に便利ではありません!)を得ることができるだけの文のキャッチ部分にあるようです。私は何を取得したいことは、内部例外メッセージである:「TABLE2」テーブルにFOREIGN KEY制約 「FK_TWO」を紹介SQL Serverのtry-catch内部例外メッセージconundrum
は サイクルまたは複数のカスケードパスを引き起こす可能性があります。 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;
[編集]
は、だから、この問題の解決策がないことをした後ずっと探しているようです。うまくいけば、将来のバージョンでこれを修正する予定です。
私はこれを行う方法がないと思います。この関連する質問も参照してください:[単一のステートメントから複数のエラーメッセージを取り込む](http://stackoverflow.com/questions/3697492/capturing-multiple-error-messages-from-a-single-statement) –