2012-02-14 5 views
1

誰かがなぜ10個の一重引用符をここに入力してカラムに格納する必要があるのか​​説明できますか?私はこれにロジックを理解しようとしています。..動的SQLで引用符をエスケープするために、一重引用符を何度も入力する必要があるのはなぜですか?

exec('UPDATE [SomeTable] SET [SomeColumn] = '''''''''''', [AnotherColumn] = Null ') 

を私は望んでいた所望の出力を得たまで、私は引用符を追加保たれますが、今、私は非常に多くの引用符を中に入れていた理由を知りたいのです。

テーブルに「」を挿入するコードは次のようになります

答えて

1

UPDATE [SomeTable] SET [SomeColumn] = '''''', [AnotherColumn] = Null 

しかし、あなたは別の文字列内にこれを実行しているので、あなたはその結果、エスケープ引用符をエスケープする必要がありますあなたが与えたコード。

1

12桁の引用符が必要です。文字列の各引用符は、2番目の引用符でエスケープされます。通常はset column = ''''''を実行する必要がありますが、これ自体が文字列の中にあるため、エスケープされた各見積もりを2倍にする必要があります。

8

実際に''をエスケープしなくてもデータベースに保存したい場合は、同等の文字(CHAR(39))を使用することができます(空の文字列を格納するか、引用符):

EXEC(' 
    DECLARE @x TABLE(x VARCHAR(10)); 
    INSERT @x SELECT CHAR(39) + CHAR(39); 
    SELECT x FROM @x; 
'); 

私は一般的に、動的SQLを構築する際に連結し、単一引用符の醜いネスティングを回避するために、このような何か:

DECLARE @sql NVARCHAR(MAX) = N''; 

SET @sql = 'SELECT foo = $sq$bar$sq$;'; 

SET @sql = REPLACE(@sql, '$sq$', CHAR(39)); 

SELECT @sql; 

EXEC sp_executesql @sql; 

いや、それ以上のこの特定のケースがありませんもちろん、同じデータベース、テーブル、または列を大きな文字列で複数回参照している場合は、他のすべての連結処理を処理するよりも、トークン($db$、など)を置き換える方がはるかに優れています。私見では。

+0

REPLACE機能をうまく利用することは、実際のところ、確かに動的SQLを使用した次の冒険で検討することです。答えとしてマークしていない唯一の理由は、賢明ではあるが手元の質問に答えることができないからです。 – CheckRaise

+0

確かに、あなたはあなたの質問を「これらの一重引用符を除いてどうすればいいですか?それはおそらく可能性があります... –

関連する問題