web-dev-qa-db-ja.com

SQL Server 2012のRAISERROR関数のvarchar @params内で '%'をエスケープする方法

RAISERRORがメッセージを再調整できるように、paramsの%文字をエスケープする方法

declare @msg varchar(max)  = (SELECT ' Message with %  ' AS MSG)

if @msg is not null
begin
    RAISERROR (@msg ,16,1); 
end

これにより、エラーメッセージが表示されます

メッセージ2787、レベル16、状態1、行4
無効なフォーマット指定: '%'。

エンドユーザーにとって、このメッセージは判読できません。

私のメッセージはデータベースから生成され、このメッセージを設定します。

間違ったメッセージが表示されないようにする方法

set @msg = REPLACE(@msg,'%','P')

しかし、%記号を追加する方法はまだわかりません

6
adopilot

使用する %%

raiserror(N'This is a message with %%', 0, 1);
12
Remus Rusanu

パーセント記号の問題を回避するための簡単で適切な方法があります。メッセージテキストをパラメーターとして使用します。

RAISERROR ('%s', 16, 1, 'Message with %')

7
Ruutsa

SQL 2012を使用しているので、( should? )新しいTHROW構文を使用できます。

BEGIN TRY

    RAISERROR ( 'dummy', 16, 1 )

END TRY
BEGIN CATCH

    DECLARE @msg NVARCHAR(2048) = ( SELECT 'Message with %% ' AS MSG );

    THROW 51000, @msg, 1;

END CATCH

THROWはパーセント記号(%)も好きではないため、エスケープする必要があります。おそらく、FORMATMESSAGEを使用できるためです。 %サイン自体は、基本的には渡すパラメーターのプレースホルダーであるため、FORMATMESSAGEでも頭痛の種になります。したがって、正直なアドバイスは、代わりに「パーセント」ワードを使用することです。

USE tempdb

EXEC sys.sp_addmessage
      @msgnum   = 60001
    , @severity = 16
    , @msgtext  = N'I am 99.99999% this will NOT work.' -- OK this definitely won't work
    , @lang = 'us_english'
    , @replace = 'replace'
    GO

DECLARE @msg NVARCHAR(2048) = FORMATMESSAGE(60001, 'test1' ); 

THROW 60001, @msg, 1; 
GO

EXEC sys.sp_addmessage
      @msgnum   = 60001
    , @severity = 16
    , @msgtext  = N'Even if you escape it, the sign  %%  disappears...' -- Even if you escape it
    , @lang = 'us_english'
    , @replace = 'replace'
    GO

DECLARE @msg NVARCHAR(2048) = FORMATMESSAGE(60001, 'test1' ); 

THROW 60001, @msg, 1; 
GO


EXEC sys.sp_addmessage
      @msgnum   = 60001
    , @severity = 16
    , @msgtext  = N'I am 100 percent sure this will work.'
    , @lang = 'us_english'
    , @replace = 'replace'
GO

DECLARE @msg NVARCHAR(2048) = FORMATMESSAGE(60001, 'test1' ); 

THROW 60001, @msg, 1;
GO


-- Tidy up
EXEC sys.sp_dropmessage 60001
4
wBob

別の非常にクリーンな方法は、変数を作成することです。

declare @PctChar char(1) = '%'

次に、その変数をformatmessageまたはraiserrorで次のように使用します。

raiserror('98%s',0,1,@PctChar);
1
Alonzo Garbanzo