SQL Serverのエスケープ文字


93

エスケープ文字付きの引用を使用したい。どのようにできるのか?

SQL Serverでエラーを受け取りました

文字列の後の閉じられていない引用符。

varchar変数にSQLクエリを書いていますが、そのエラーを受け取りました:

文字列の後の閉じられていない引用符。

引用符をエスケープ文字として使用したい。


4
クエリを見せていただけますか?
marc_s '28

回答:


72

脱出'するには、前に別のものを置く必要があります。''

2番目の答えが示すように、次のように単一引用符をエスケープすることが可能です。

select 'it''s escaped'

結果は

it's escaped

SQLをVARCHARに連結して実行する場合(つまり、動的SQL)、SQLをパラメーター化することをお勧めします。これには、SQLインジェクションに対する保護に役立つという利点があり、このように引用符をエスケープすることを心配する必要がないことを意味します(引用符を2倍にすることで行います)。

たとえば、代わりに

DECLARE @SQL NVARCHAR(1000)
SET @SQL = 'SELECT * FROM MyTable WHERE Field1 = ''AAA'''
EXECUTE(@SQL)

これを試して:

DECLARE @SQL NVARCHAR(1000)
SET @SQL = 'SELECT * FROM MyTable WHERE Field1 = @Field1'
EXECUTE sp_executesql @SQL, N'@Field1 VARCHAR(10)', 'AAA'

29
なぜこれが受け入れられた答えなのですか?質問の答えにはなりません。
Peter Moore

3
@PeterMoore OPが私の回答の最初の部分を使用するか(以下の他の回答のように引用符を2倍にする)、または文字列変数でSQLクエリを構築するために推奨される推奨されるアプローチを使用する-パラメータ化を使用するSQL。どちらの場合も、どちらも質問に対する答えです
AdaTheDev

質問の答えにはなりません。場合によっては、ユーザーがODBC接続を必要とすることがあります。つまり、純粋なSQLしか使用できません。
Tony

より明確になり、質問によりよく当てはまるように編集された回答
以前の

121

次のように引用をエスケープできます:

select 'it''s escaped'

結果は

it's escaped

これが答えになるはずです。
Tony

43

エスケープ文字は定義できますが、LIKE句と一緒にしか使用できません。

例:

SELECT columns FROM table
WHERE column LIKE '%\%%' ESCAPE '\'

ここでは%文字列全体を検索ESCAPESQL Serverます。これがで識別子を使用する方法です。


21

あなただけ交換する必要がある'''あなたの文字列の内部

SELECT colA, colB, colC
FROM tableD
WHERE colA = 'John''s Mobile'

REPLACE(@name, '''', '''''')SQLを動的に生成する場合にも使用できます

likeステートメント内でエスケープする場合は、ESCAPE構文を使用する必要があります

また、SQLインジェクション攻撃を考慮しない場合は、SQLインジェクション攻撃にさらされていることにも触れておく価値があります。Googleの詳細またはhttp://it.toolbox.com/wiki/index.php/How_do_I_escape_single_quotes_in_SQL_queries%3F


それでもdugokontovまたはRichardPiankaによる回答に似た-1はありませんか?
SEPH

@MichaelMunseyは自分で試してみてselect 'くださいUnclosed quotation mark after the character string ''。エラーを返します。私の回答のどこにも"2つしか使用して'いません。なぜ私が反対票を投じた唯一の回答であるかはわかりません。
2015

12

MSSQLでの引用符のエスケープは二重引用符で行われるため、a ''またはa ""はそれぞれエスケープされた'とを生成し"ます。



0

変数内のユーザー入力をエスケープする場合は、SQL内で以下のようにすることができます

  Set @userinput = replace(@userinput,'''','''''')

@userinputは、引用符が出現するたびに追加の単一引用符でエスケープされます。



-2

コードを読みやすくするために、角かっこ[]を使用して文字列を引用符で囲んだり、'その逆を行うことができます。


これは誤りです。大括弧は、フィールド、テーブル、またはスキーマ名の無効な文字に対して機能します。
ジェイミーマーシャル

ええ、あなたは正しい、それは文字列の内容ではなくオブジェクト名のためのものです。私はその質問を間違って読まなければならない。
ベン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.