sql >> Base de Datos >  >> RDS >> Sqlserver

Escape de comillas simples en SQL Server

Un consejo. Al probar un script dinámico, primero muéstrelo en lugar de ejecutarlo. De esa manera, podrá verlo exactamente como lo vería el EXEC declaración.

Ahora al tema. Debe tener en cuenta que no está pasando la variable a SplitValues pero en cambio están concatenando el valor de la variable en el script. Dado que el valor es varchar , debe concatenarse entre comillas. La ausencia de ellos es el único problema realmente.

Las comillas alrededor del segundo argumento, la coma, se escapan correctamente en ambos casos . Entonces, solo use cualquiera de los métodos para agregar las comillas alrededor del primer argumento:

  • repetición de las comillas:

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

Obviamente, el primer método es más compacto, pero, como dije, ambos funcionan bien, como muestra claramente esta demostración de SQL Fiddle.

Tenga en cuenta, sin embargo, que podría escapar fácilmente de este problema en primer lugar, si perdona el juego de palabras. En lugar de EXEC () , podría usar EXEC sp_executesql , que le permite usar parámetros . Aquí está el mismo script reescrito para usar 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;

Como puede ver, no debe preocuparse por escapar de las comillas:SQL Server se toma la molestia de sustituir los valores correctamente, no usted.