15

OK、検索ストアド プロシージャに次のコード行があります。

SET @where = 'job_code = ''' + REPLACE(@job_code, '''', '''''') + ''''

そして、基本的に合理化したい操作が 2 つあります。最初の操作は、連結された値を一重引用符で囲みます。'明らかに、上記のステートメントでは、 2 を使用してa をエスケープし、実際の値を連結できるように''文字列を a で終了しています。'もっといい方法があるに違いない!

操作の 2 番目はREPLACE(@job_code, '''', '''''')、フィールドに存在する可能性のある単一引用符をエスケープする場所です。

このコード行全体をより洗練された方法で書く方法はありませんか?

私はそれがESCAPEキーワードだと思ったが、それは声明に密接に結びついているLIKEので、そこには行かない.

4

4 に答える 4

28

sp_executesql を使用する場合、SQL クエリを実行する方法がわからない場合は、次のようになります。

EXECUTE sp_executesql 
          N'SELECT * FROM YouTable WHERE job_code = @job_code',
          N'@job_code varchar(100)',
          @job_code = @job_code;
于 2013-04-30T20:28:44.543 に答える
6

パラメータ化されたクエリの答えはおそらく本当の「正しい答え」ですが、元の質問に答えるには、QUOTENAME()が必要です。より具体的には、一重引用符バージョン:

SET @where = 'job_code = ' + QUOTENAME(@job_code, '''')

ただしsysname、これはデータベース オブジェクトの名前を引用することを目的としており、汎用メカニズムとしてではありません。

于 2013-05-03T19:15:43.410 に答える
2

次のような典型的なシナリオを処理する関数を定義できます。

create function WrapAndReplaceQuotes (@input as varchar(max))
returns varchar(max)
as
begin
    return '''' + replace(@input, '''', '''''') + ''''
end

SET @where = 'job_code = ' + WrapAndReplaceQuotes(@job_code)
于 2013-04-30T20:27:20.053 に答える
2

定数を宣言できます:

declare @SQ as char(1) = ''''

SET @where = 'job_code = ' + @SQ + REPLACE(@job_code, @SQ, @SQ + @SQ) + @SQ
于 2013-04-30T20:22:36.160 に答える