Comment je devrais échapper à la %
caractère dans les paramètres donc mon RAISERROR
retint mon message
declare @msg varchar(max) = (SELECT ' Message with % ' AS MSG)
if @msg is not null
begin
RAISERROR (@msg ,16,1);
end
Cela augmentera l'erreur avec le message
MSG 2787, niveau 16, état 1, ligne 4
Spécification de format invalide: '%'.
Pour les utilisateurs finaux, ce message est illisible.
Mes messages sont générés à partir de la base de données et définissent ce message.
Façon d'éviter que de vous procurer un mauvais message est de remplacer
set @msg = REPLACE(@msg,'%','P')
Mais je ne sais toujours pas comment ajouter %
signer
Utilisation %%
:
raiserror(N'This is a message with %%', 0, 1);
Il y a un moyen simple et net de travailler autour du problème de signes en pourcentage. Utilisez le texte du message comme paramètre:
RAISERROR ('%s', 16, 1, 'Message with %')
Comme vous utilisez SQL 2012, vous pouvez ( devrait? ) Utilisez la nouvelle syntaxe de lancer, par exemple
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
Bien que Jetez N'aimez pas les panneaux de pourcentage (%) non plus, vous devez toujours vous échapper, probablement parce que vous pouvez utiliser FormationMessage avec elle. % signe de leur propre cause un mal de tête pour formatMessage aussi comme ils sont essentiellement des espaces réservés pour les paramètres que vous passez. Donc, mon conseil honnête serait de simplement utiliser le mot "pourcentage" à la place:
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
Un autre, très propre, de manière à créer une variable par exemple:
declare @PctChar char(1) = '%'
ensuite, utilisez cette variable dans formatmessage
ou raiserror
, comme suit:
raiserror('98%s',0,1,@PctChar);