Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Einfaches Anführungszeichen in SQL Server maskieren

Ein Ratschlag. Wenn Sie ein dynamisches Skript testen, zeigen Sie es zunächst nur an, anstatt es auszuführen. Auf diese Weise können Sie es genau so sehen, wie es von EXEC gesehen würde Aussage.

Nun zum Thema. Sie sollten bedenken, dass Sie die Variable nicht übergeben zu SplitValues sondern verketten stattdessen den Wert der Variablen in das Skript. Da der Wert varchar ist , sollte es mit Anführungszeichen verkettet werden. Das Fehlen von ihnen ist wirklich das einzige Problem.

Die Anführungszeichen um das zweite Argument, das Komma, werden in beiden Fällen korrekt maskiert . Verwenden Sie also einfach eine der Methoden, um die Anführungszeichen um das erste Argument hinzuzufügen:

  • Wiederholung des Anführungszeichens:

    DECLARE @year varchar(max), @sql varchar(max);
    SET @year = '111,11';
    SET @sql = 'SELECT * FROM SplitValues(''' + @year + ''','','')';
    SELECT @sql;
    
  • mit CHAR(39) :

    DECLARE @year varchar(max), @sql varchar(max);
    SET @year = '111,11';
    SET @sql = 'SELECT * FROM SplitValues(' + CHAR(39) + @year + CHAR(39) + ',' + CHAR(39) + ',' + CHAR(39) + ')';
    SELECT @sql;
    

Offensichtlich ist die erste Methode kompakter, aber wie gesagt, beide funktionieren gut, wie diese SQL Fiddle-Demo deutlich zeigt.

Beachten Sie jedoch, dass Sie diesem Problem von vornherein leicht entkommen könnten, wenn Sie das Wortspiel entschuldigen. Statt EXEC () , könnten Sie EXEC sp_executesql verwenden , wodurch Sie Parameter verwenden können . Hier ist dasselbe Skript umgeschrieben, um sp_executesql zu verwenden :

DECLARE @year varchar(max), @delim char(1);
SET @year = '111,11';
SET @delim = ',';
EXEC sp_executesql
  N'SELECT * FROM SplitValues(@year_param,@delim_param)',
  N'@year_param varchar(max), @delim_param char(1)',
  @year,@delim;

Wie Sie sehen, müssen Sie sich keine Gedanken über das Escapezeichen der Anführungszeichen machen:SQL Server übernimmt die Mühe, die Werte korrekt zu ersetzen, nicht Sie.