20

以下のステートメントを実行して、一重引用符をエスケープしようとしました(つまり、2つの一重引用符を使用しました)。

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

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

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

しかし、それは役に立ちませんでした。これらは私がこのサイトで見つけた唯一の2つの解決策です。何か助けはありますか?

これは、すべての質問をクリアするための簡略化されたクエリです。

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

これを実現したいのですが、動的クエリを使用しています。

4

4 に答える 4

35

アドバイスの一言。動的スクリプトをテストするときは、実行するのではなく、最初に表示するだけです。そうすれば、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は、ユーザーではなく、値を正しく置き換える手間をかけます。

于 2013-03-15T21:23:47.013 に答える
15

一重引用符を2回入力するだけです。

select 'that''s it'
于 2013-03-14T12:16:21.203 に答える
3

わかりました...この文字列を取得します:

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

そして、次のような文字列にします。

'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()sp_sqlexecuteただし、パラメータ化されたクエリを使用できるため、実際にはこのようなものに使用する必要があります。

于 2013-03-14T21:42:32.133 に答える
-1
declare @var1 varchar(100)
declare @var3 varchar(100)
declare @var4 varchar(100)

declare @var2 nvarchar(MAX)
set @var1 = ‘anil’
set @var4 = ‘1019518594’

set @var2 = N’select
a.*
from card b
join log a on a.Cust = b.ID
where a.c = ”’ + @var1 + ”’ and b.s =”’+ @var4 +””

print(@var2)

exec sp_executesql @var2
于 2019-12-10T10:04:25.710 に答える