sql >> Databáze >  >> RDS >> Sqlserver

Escapování jednoduché uvozovky v SQL Server

Malá rada. Při testování dynamického skriptu jej nejprve zobrazte, místo abyste jej spustili. Tak to budete moci vidět přesně tak, jak by to viděl EXEC prohlášení.

Nyní k problému. Měli byste mít na paměti, že nepředáváte proměnnou na SplitValues ale místo toho zřetězí hodnotu proměnné do skriptu. Protože hodnota je varchar , měl by být spojen s uvozovkami. Jejich absence je skutečně jediným problémem.

Uvozovky kolem druhého argumentu, čárky, jsou v obou případech správně uvozeny . Takže použijte jednu z metod k přidání uvozovek kolem prvního argumentu:

  • opakování uvozovky:

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

První metoda je samozřejmě kompaktnější, ale jak jsem řekl, obě fungují dobře, jak jasně ukazuje ukázka SQL Fiddle.

Všimněte si však, že tomuto problému můžete snadno uniknout, pokud prominete slovní hříčku. Místo EXEC () , můžete použít EXEC sp_executesql , který umožňuje používat parametry . Zde je stejný skript přepsaný pro použití 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;

Jak vidíte, není třeba se starat o to, že unikáte z uvozovek:SQL Server si dává tu práci se správným nahrazením hodnot, ne vy.



  1. Regulární výraz (RegEx) pro IPv6 Oddělený od IPv4

  2. Jaký datový typ MySQL použít pro ukládání booleovských hodnot

  3. Jak získat přístup k PhpMyAdmin bez přihlášení k cPanel

  4. Jak FROM_DAYS() funguje v MariaDB