Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

virgolette singole di escape in SQL Server

Un consiglio. Quando si testa uno script dinamico, per prima cosa basta visualizzarlo invece di eseguirlo. In questo modo sarai in grado di vederlo esattamente come sarebbe visto da EXEC dichiarazione.

Ora alla questione. Tieni presente che non stai passando la variabile a SplitValues ma stanno invece concatenando il valore della variabile nello script. Poiché il valore è varchar , dovrebbe essere concatenato tra virgolette. L'assenza di loro è davvero l'unico problema.

Le virgolette intorno al secondo argomento, la virgola, vengono salvate correttamente in entrambi i casi . Quindi, usa uno dei metodi per aggiungere le virgolette attorno al primo argomento:

  • ripetizione delle virgolette:

    DECLARE @year varchar(max), @sql varchar(max);
    SET @year = '111,11';
    SET @sql = 'SELECT * FROM SplitValues(''' + @year + ''','','')';
    SELECT @sql;
    
  • utilizzando 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;
    

Ovviamente, il primo metodo è più compatto, ma, come ho detto, entrambi funzionano bene, come mostra chiaramente questa demo di SQL Fiddle.

Nota, tuttavia, che potresti facilmente sfuggire a questo problema in primo luogo, se perdoni il gioco di parole. Invece di EXEC () , potresti usare EXEC sp_executesql , che ti consente di utilizzare parametri . Ecco lo stesso script riscritto per usare sp_executesql :

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;

Come puoi vedere, non devi preoccuparti di evitare le virgolette:SQL Server si prende la briga di sostituire i valori correttamente, non tu.