2013-03-14 2 views
14

SQL Serverで単一引用符をエスケープ:(つまり、2つの単一引用符を使用して)私は単一引用符をエスケープするには、以下のステートメントを実行しようとしていた

declare @year varchar(max) 
set @year = '111,11'; 
exec ('SELECT * FROM SplitValues(' + @year + ',' + char(39) + ',' + char(39) + ')'); 

declare @year varchar(max) 
set @year = '111,11'; 
exec ('SELECT * FROM SplitValues(' + @year + ','','')'); 

私も引用符の代わりにchar(39)を使用しようとしました

しかし、それは役に立たなかった。これらは私がこのサイトで見つけた唯一の2つの解決策です。どんな助け?

これは、すべてのご質問をクリアするために単純化されたクエリです:

declare @year varchar(max) 
set @year = '111,11'; 
SELECT * FROM SplitValues(@year , ',') 

私はこれを達成したいのですが、動的なクエリを使用して。

+0

なぜここでEXECを使用する必要がありますか? – Bridge

+0

これは、私が今働いている質問が非常に複雑で、ここに投稿できないためです。これは私が何をしようとしているのかちょうど垣間見ることです。 – Saksham

+0

* [SQL Serverで単一引用符を置き換える](http://stackoverflow.com/questions/1440733/replace-single-quotes-in-sql-server)*の重複が考えられます。 –

答えて

23

助言の言葉。動的スクリプトをテストするときは、最初に実行する代わりに表示してください。そうすれば、EXECステートメントで見られるように正確に見ることができます。

問題が発生しました。 変数SplitValuesに渡すのではなく、その変数の値をスクリプトに連結することに注意してください。値はvarcharであるため、値の前後に引用符を使用して連結する必要があります。それらの欠如は本当に唯一の問題です。

両方の場合、第2引数のカンマの引用符は、正確にエスケープされます。それでは、最初の引数の前後に引用符を追加する方法のいずれかを使用します。引用符の

  • 繰り返し:CHAR(39)を使用して

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

明らかに、最初の方法はよりコンパクトですが、私が言ったように、どちらもうまくいきます。this SQL Fiddle demoは明らかに示しています。

ただし、この問題を最初に取り除くことができます。EXEC()の代わりにEXEC 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; 

あなたは、引用符をエスケープを心配する必要を見ないように:SQL Serverは、あなたは、正確な値を代入する手間をない取るここsp_executesqlを使用するようにリライト同じスクリプトです。

+0

申し訳ありませんが、わかりません。あなたがここで観察している問題は何ですか? –

+0

最初のステートメントでは、検証のためにコマンドを実行するのではなく、コマンドを出力する必要がありますが、sp_executesqlでは実行しないで文を印刷するオプションはありません。方法がある場合は、おそらくそれを実証する必要があります。 私は、この文を印刷するのは、選択肢よりも読みやすいので、限られた有用性があると思います。 –

+0

ダイナミッククエリに名前パラメータが含まれていない場合(この場合は何もありません)、一緒に接着された多くの部分から構築する必要はありません。だから、変数を使ってクエリを格納するだけで、実行の前に/代わりにそれを表示することはほとんど価値がないように見えます。 –

8

ただ、単一引用符を2回入力します。

SELECT * FROM SplitValues(@year , ',') 

そして、このような文字列にする:[OK]を...あなたはこの文字列を取りたい

select 'that''s it' 
+0

これは、私が投稿した解決策で見られるように、私が試した最初のものです。 – Saksham

+1

正確ではありません。 '+ char(39)+'はあなたに4つの引用符を与えますが、3つの引用符を与えます。文全体を試してみましょう: exec( 'SELECT * FROM SplitValues(' '' + @year + '' '、' '' ')'); –

2

'SELECT * FROM SplitValues('111,11' , '','')' 

最終コードは次のようになります。

declare @year varchar(max), @sql varchar(max) 
set @year = '111,11'; 
set @sql = 'SELECT * FROM SplitValues(''' + @year + ''' , '''','''')' 

select @sql 

実際には、代わりにexec()を使用することを選択します。しかし、実際には、paramaterizedクエリを使用できるので、おそらくsp_sqlexecuteをこのようなものに使用するべきです。

関連する問題