web-dev-qa-db-ja.com

SQL Serverで一重引用符をエスケープする方法

テキストデータをSQL Server 9の表にinsertしています。

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

どうやってそれを逃れるのですか?

二重引用符を使用してみましたが、いくつかのエラーが発生しました。

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

792
tim_wonil

一重引用符は、例で示したように、それらを2倍にすることでエスケープされます 。次の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.
1168
Cᴏʀʏ

単一引用符を別の単一引用符でエスケープしてもうまくいかない場合(最近の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
64
Brad Waite

どうですか?

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

見積もりを2倍にしてもうまくいくはずなので、うまくいかなかったのは独特です。ただし、別の方法としては、文字列の周囲に単一引用符ではなく二重引用符を使用することです。すなわち、

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

16
Alex Martelli

また、注意すべきもう1つのことは、それが本当に古典的なASCII '(ASCII 27)として保存されているのか、それともUnicode 2019として保存されているのかです。

これは挿入については大した問題ではありませんが、選択と更新に関する世界を意味する可能性があります。
もしそれがUnicodeの値であれば、 'in a WHERE句(例えばblah =' Workers''s Comp ')をエスケープすることはあなたが探している値が' Worker's 'の中にない場合のように戻ります。 Comp "は実際にはUnicode値です。

あなたのクライアントアプリケーションがコピーベースの入力と同様にフリーキーをサポートするならば、それはいくつかの行ではUnicodeであり、他の行ではASCIIです!

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

ASCII値とUnicode値の外観の違いは目には明らかですが、肛門方向に傾いている場合、16進エディタでは27(ASCII)または92(Unicode)と表示されます。

6
Daniel Schmidt

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


'の場合は、文字列の中で2倍にすることができます。 select 'I''m happpy' -- will get: I'm happy


どの文字についても確信が持てません。SQLサーバではselect unicode(':')によってcharのUnicodeを取得できます。

だからこの場合あなたはまたselect 'I'+nchar(39)+'m happpy'することができます

4
Xin

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

例:I'm fineのようなフィールドがある場合。 UPDATE my_table SET row = 'I''m fine。';

0
laxman Thapa

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

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

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

これは動作するはずです。バックスラッシュを使用し、二重引用符を付けます。

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