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.