SQL Serverで単一引用符をエスケープするにはどうすればよいですか?


956

9のinsertテーブルにテキストデータを挿入しようとしていますSQL Server

テキストには単一引用符( ')が含まれています。

どうすればそれを回避できますか?

単一引用符を2つ使用してみましたが、エラーが発生しました。

例えば。 insert into my_table values('hi, my name''s tim.');


30
「それは私にいくつかのエラーを投げました」-これらのエラーは何でしたか?
llamaoo7 2009年

はい。MSSQLに一重引用符を挿入する正しい方法は、二重引用符を使用することです。あなたが私たちに示した例はうまくいくはずです。どのようにしてこのSQLクエリを作成しますか?それともSQL Server Management Studioですか?
MaxiWheat 2009年

回答:


1388

単一引用符は、例で示したように、二重引用符でエスケープします。次のSQLは、この機能を示しています。SQL Server 2008でテストしました。

DECLARE @my_table TABLE (
    [value] VARCHAR(200)
)

INSERT INTO @my_table VALUES ('hi, my name''s tim.')

SELECT * FROM @my_table

結果

value
==================
hi, my name's tim.

16
私は自分の問題を解決するために間違った場所を見ていました。結局のところ、それはキャラクターエスケープの問題ではありませんでした。私の問題は、データ長が制限を超えていたことでした。一重引用符を2回使用することが文字をエスケープする正しい方法であることを私に安心させてくれてありがとう。
tim_wonil

それで、1万語を含むテキストがある場合、すべてのテキストを置き換える必要がありますか?
Vinicius Lima

3
@ViniciusLima:短い答えはイエスです。もちろん、データを格納するために使用するテクノロジーによって異なります。ORMを使用している場合は、ORMが代わりに行います。SQLコマンドを手動で作成する場合は、言語の「準備されたステートメント」機能を使用する必要があります。Management Studioで行う場合は、置換を行う必要があります。
Cᴏʀʏ

1
つまり、1つの2つの単一引用符。[''] => [']
Ujjwal Singh 14

67

単一引用符を別の単一引用符でエスケープしてもうまくいかない場合(私の最近のREPLACE()クエリの1つではそうでなかったように)、クエリのSET QUOTED_IDENTIFIER OFF前に使用し、クエリのSET QUOTED_IDENTIFIER ON後に使用できます。

例えば

SET QUOTED_IDENTIFIER OFF;

UPDATE TABLE SET NAME = REPLACE(NAME, "'S", "S");

SET QUOTED_IDENTIFIER ON;
-- set OFF then ON again

2
通常は2倍のアプローチを使用しますが、動的SQLを生成して複数のサーバーやデータベースで実行する場合、このソリューションはうまくいきましたが、特定のケースでは2倍にすることはできませんでした。これをありがとう!
Richard Moss

計算列のビューとインデックスを参照するときは注意してください。そうしないと、エラーが発生する可能性があります。 stackoverflow.com/questions/9235527/...
datagod

@ RichardMoss、+ 1。あなたと同じシナリオ。二重化アプローチが最初のソリューションです。複数のサーバーにわたる動的SQLのような複雑なクエリの場合、これは機能しますが、2倍のアプローチは機能しない可能性があります
Edgar Allan Bayron

48

どうですか:

insert into my_table values('hi, my name'+char(39)+'s tim.')

18
代わりにchar(39)を使用してください
Iswanto San

17

引用の倍増はうまくいくはずだったので、うまくいかなかったのは奇妙です。ただし、代わりに、文字列を単一引用符ではなく二重引用符で囲みます。つまり、

insert into my_table values("hi, my name's tim.");


4
テキストに単一引用符と二重引用符の両方が含まれている場合はどうなりますか?また、二重引用符はフィールド名のみに予約されていませんか?
Lajos Meszaros 2017年

11

これを回避する2つの方法:


'あなたは単純にそれを文字列で2倍にすることができます、例えば select 'I''m happpy'-は得ます:I'm happy


不明な文字について:SQLサーバーでは、任意の文字のユニコードを取得できますselect unicode(':')(番号を保持します)

したがって、この場合もできます select 'I'+nchar(39)+'m happpy'


6

また、注意が必要なもう1つの点は、実際にクラシックASCII(ASCII 27)またはUnicode 2019(類似しているが同じではない)として保存されているかどうかです。

これは挿入では大したことではありませんが、選択と更新の世界を意味する可能性があります。
それがユニコード値の場合、WHERE句で 'をエスケープすると(例:blah =' Workers ''s Comp')、「Worker's Comp」の 'が実際にユニコード値。

クライアントアプリケーションがフリーキーと、コピーアンドペーストベースの入力をサポートしている場合、一部の行ではUnicode、その他の行ではASCIIになります。

これを確認する簡単な方法は、検索している値を返すある種のオープンエンドクエリを実行し、それをコピーして、notepad ++またはその他のUnicode対応のエディターに貼り付けることです。

ASCII値とUnicode値の外観の違いは目で見てわかるはずですが、肛門に寄りかかると、16進エディターで27(ASCII)または92(Unicode)として表示されます。


4

私たちの多くは、単一引用符をエスケープする一般的な方法は、以下のように簡単に二重引用符を二重にすることであることを知っています。

PRINT 'It''s me, Arul.';

単一引用符法の倍増

単一引用符をエスケープする他のいくつかの代替方法を調べます。

1.UNICODE文字

39は、単一引用符のUNICODE文字です。以下のように使用できます。

PRINT 'Hi,it'+CHAR(39)+'s Arul.';
PRINT 'Helo,it'+NCHAR(39)+'s Arul.';

UNICODE文字

2.QUOTED_IDENTIFIER

別のシンプルで最適な代替ソリューションは、QUOTED_IDENTIFIERを使用することです。QUOTED_IDENTIFIERをOFFに設定すると、文字列を二重引用符で囲むことができます。このシナリオでは、一重引用符をエスケープする必要はありません。したがって、この方法は、単一引用符で多くの文字列値を使用する場合に非常に役立ちます。列の値に単一引用符が含まれているINSERT / UPDATEスクリプトの非常に多くの行を使用している間は、非常に役立ちます。

SET QUOTED_IDENTIFIER OFF;
PRINT "It's Arul."
SET QUOTED_IDENTIFIER ON;

QUOTE_IDENTIFIER

結論

上記の方法は、AZUREとオンプレミスの両方に適用できます。


1

次の構文では、引用符を1つだけエスケープします。

SELECT ''''

結果は単一引用符になります。動的SQLの作成に非常に役立つ可能性があります。 ここに画像の説明を入力してください


0

これはうまくいくはずです

DECLARE @singleQuote CHAR 
SET @singleQuote =  CHAR(39)

insert into my_table values('hi, my name'+ @singleQuote +'s tim.')

0

挿入するものの前に 'を挿入するだけです。sqlServerのエスケープ文字のようになります。

例:フィールドがある場合、私は元気です。あなたはできる:UPDATE my_table SET row = 'I''m fine。';


それはまさにOPがしたことではなく、トップ投票の回答がすでに言っているのと同じですか?おそらく他にもエラーの原因があったはずです。
Michael MacAskill

-2

これは動作するはずです:バックスラッシュを使用して二重引用符を入れてください

"UPDATE my_table SET row =\"hi, my name's tim.\";

どういう意味ですか?あなたはそれPRINT \"hi, my name's tim.\";がSSMSでうまくいくと言っていますか?それはまったく機能せず、誰もそれが機能することをこれまでに言ったことがありません。
Mohammad Musavi

動作しません。
Santosh Jadi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.