アドバイスの一言。動的スクリプトをテストするときは、実行するのではなく、最初に表示するだけです。そうすれば、EXEC
で表示されるのとまったく同じように表示できます。 ステートメント。
今問題に。 変数を渡していないことに注意してください。 SplitValues
へ ただし、代わりに変数の値をスクリプトに連結しています。値はvarchar
なので 、周囲を引用符で囲む必要があります。それらがないことが本当に唯一の問題です。
2番目の引数であるコンマを囲む引用符は、どちらの場合も正しくエスケープされます 。したがって、いずれかの方法を使用して、最初の引数を引用符で囲みます。
-
引用符の繰り返し:
DECLARE @year varchar(max), @sql varchar(max); SET @year = '111,11'; SET @sql = 'SELECT * FROM SplitValues(''' + @year + ''','','')'; SELECT @sql;
-
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;
明らかに、最初の方法はよりコンパクトですが、私が言ったように、このSQL Fiddleデモが明確に示しているように、両方ともうまく機能します。
ただし、しゃれを許せば、そもそもこの問題を簡単に回避できることに注意してください。 EXEC ()
の代わりに 、EXEC sp_executesql
を使用できます 、パラメータを使用できます 。これは、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;
ご覧のとおり、引用符をエスケープすることを心配する必要はありません。SQLServerは、ユーザーではなく、値を正しく置き換える手間をかけます。