3

重複の可能性:
SQL Server から _exact_ エラーを見つけるにはどうすればよいですか

クライアントの 1 人は、UNIQUE KEY 違反時のカスタム エラー メッセージを望んでいます。

次のシナリオを考えます。

CREATE TABLE [dbo].[Pip]
(
    id int IDENTITY(1,1) NOT NULL,
    code NVARCHAR(50) NOT NULL,
    CONSTRAINT [PK_Pip] PRIMARY KEY ([id]), 
    CONSTRAINT [UQ_Pip_Code] UNIQUE([code]), 
)

BEGIN TRY
    INSERT INTO Pip(code) VALUES('TEST')
    INSERT INTO Pip(code) VALUES('TEST')
END TRY
BEGIN CATCH
    DECLARE @error INT, @message VARCHAR(4000), @xstate INT;
    SELECT @error = ERROR_NUMBER(), @message = ERROR_MESSAGE(), @xstate = XACT_STATE();

    IF @errorNumber = 2627 OR @errorNumber = 2601 BEGIN
        RAISERROR('<custom unique key violation error message>', 16, 1)
    END
END CATCH

必要なのは、定義された一意のキーごとにエラー メッセージを指定できるように、CATCH セクションで違反している一意のキーの名前です。

もちろん、このテーブルにアクセスするさまざまなストアド プロシージャに手動でチェックを追加することもできますが、これではコードの保守性が低下するため、これは望ましいことではありません。

SQL Server (2008R2) でそのような可能性はありますか?

sys.messages-table に基づいて、ある種の正規表現で ERROR_MESSAGE() を解析することを考えました。しかし、これは間違ったことのように感じます。

ありがとう!
サンダー

4

1 に答える 1

0

RaiseError にはオプションのパラメーターがあるため、テーブル名などのパラメーターを渡すことができ、それが代用されます。

ヘルプから直接

RAISERROR (N'This is message %s %d.', -- Message text.
           10, -- Severity,
           1, -- State,
           N'number', -- First argument.
           5); -- Second argument.
-- The message text returned is: This is message number 5.
GO
于 2013-01-14T12:25:38.563 に答える