Een woord van advies. Wanneer u een dynamisch script test, moet u het eerst weergeven in plaats van het uit te voeren. Op die manier kun je het precies zien zoals het zou worden gezien door de EXEC
verklaring.
Nu naar de kwestie. Houd er rekening mee dat u de variabele . niet doorgeeft naar SplitValues
maar voegen in plaats daarvan de waarde van de variabele samen in het script. Aangezien de waarde varchar
. is , het moet worden aaneengeschakeld met aanhalingstekens eromheen. De afwezigheid ervan is eigenlijk het enige probleem.
De aanhalingstekens rond het tweede argument, de komma, zijn correct ontsnapt in beide gevallen . Gebruik dus gewoon een van de methoden om de aanhalingstekens rond het eerste argument toe te voegen:
-
herhaling van het aanhalingsteken:
DECLARE @year varchar(max), @sql varchar(max); SET @year = '111,11'; SET @sql = 'SELECT * FROM SplitValues(''' + @year + ''','','')'; SELECT @sql;
-
met behulp van
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;
Uiteraard is de eerste methode compacter, maar, zoals ik al zei, beide werken goed, zoals deze SQL Fiddle-demo duidelijk laat zien.
Houd er echter rekening mee dat u in de eerste plaats gemakkelijk aan dit probleem zou kunnen ontsnappen, als u de woordspeling vergeeft. In plaats van EXEC ()
, je zou EXEC sp_executesql
. kunnen gebruiken , waarmee u parameters . kunt gebruiken . Hier is hetzelfde script herschreven om sp_executesql
te gebruiken :
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;
Zoals u kunt zien, hoeft u zich geen zorgen te maken dat u aan de aanhalingstekens ontsnapt:SQL Server neemt de moeite om de waarden correct te vervangen, niet u.