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

Undslippende enkelt citat i SQL Server

Et råd. Når du tester et dynamisk script, skal du først bare vise det i stedet for at udføre det. På den måde vil du være i stand til at se det nøjagtigt, som det ville blive set af EXEC erklæring.

Nu til spørgsmålet. Du skal huske på, at du ikke videregiver variablen til SplitValues men sammenkæder i stedet variablens værdi i scriptet. Da værdien er varchar , skal det være sammenkædet med anførselstegn rundt om det. Fraværet af dem er egentlig det eneste problem.

Anførselstegnene omkring det andet argument, kommaet, escapes korrekt i begge tilfælde . Så brug bare en af ​​metoderne til at tilføje anførselstegn omkring det første argument:

  • gentagelse af anførselstegn:

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

Det er klart, at den første metode er mere kompakt, men som sagt fungerer begge dele godt, som denne SQL Fiddle-demo tydeligt viser.

Bemærk dog, at du nemt kan undslippe dette problem i første omgang, hvis du undskylder ordspillet. I stedet for EXEC () , kan du bruge EXEC sp_executesql , som giver dig mulighed for at bruge parametre . Her er det samme script omskrevet til at bruge 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;

Som du kan se, behøver du ikke bekymre dig om at undslippe anførselstegnene:SQL Server tager den ulejlighed at erstatte værdierne korrekt, ikke dig.



  1. Halloween-problemet – del 4

  2. Søg i Microsoft SQL Server-databasen efter lagrede data

  3. MySQL – FOUND_ROWS() Funktion for det samlede antal berørte rækker

  4. Sådan fungerer Acosh() i PostgreSQL