Mała rada. Podczas testowania skryptu dynamicznego najpierw po prostu wyświetl go zamiast wykonywać. W ten sposób będziesz mógł zobaczyć go dokładnie tak, jak widziałby go EXEC
oświadczenie.
Przejdźmy teraz do sprawy. Pamiętaj, że nie przekazujesz zmiennej do SplitValues
ale zamiast tego łączą wartość zmiennej w skrypcie. Ponieważ wartość to varchar
, powinien być połączony ze znakami cudzysłowu. Ich brak jest tak naprawdę jedynym problemem.
Cudzysłowy wokół drugiego argumentu, przecinka, są poprawnie escapowane w obu przypadkach . Tak więc po prostu użyj jednej z metod, aby dodać cudzysłowy wokół pierwszego argumentu:
-
powtórzenie cudzysłowu:
DECLARE @year varchar(max), @sql varchar(max); SET @year = '111,11'; SET @sql = 'SELECT * FROM SplitValues(''' + @year + ''','','')'; SELECT @sql;
-
używając
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;
Oczywiście pierwsza metoda jest bardziej kompaktowa, ale, jak powiedziałem, obie działają dobrze, co wyraźnie pokazuje to demo SQL Fiddle.
Pamiętaj jednak, że możesz łatwo uniknąć tego problemu, jeśli wybaczysz grę słów. Zamiast EXEC ()
, możesz użyć EXEC sp_executesql
, który umożliwia korzystanie z parametrów . Oto ten sam skrypt przepisany, aby używał 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 widać, nie musisz się martwić o unikanie cudzysłowów:SQL Server zadaje sobie trud prawidłowego podstawiania wartości, a nie Ty.