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')
しかし、%
記号を追加する方法はまだわかりません
使用する %%
:
raiserror(N'This is a message with %%', 0, 1);
パーセント記号の問題を回避するための簡単で適切な方法があります。メッセージテキストをパラメーターとして使用します。
RAISERROR ('%s', 16, 1, 'Message with %')
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
別の非常にクリーンな方法は、変数を作成することです。
declare @PctChar char(1) = '%'
次に、その変数をformatmessage
またはraiserror
で次のように使用します。
raiserror('98%s',0,1,@PctChar);