web-dev-qa-db-fra.com

Comment échapper à "%" à ​​l'intérieur de Varcharne @params pour la fonction RAISError dans SQL Server 2012

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

6
adopilot

Utilisation %%:

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

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 %')

7
Ruutsa

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
4
wBob

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);
1
Alonzo Garbanzo