テキストデータをSQL Server
9の表にinsert
しています。
テキストには一重引用符( ')が含まれています。
どうやってそれを逃れるのですか?
二重引用符を使用してみましたが、いくつかのエラーが発生しました。
例えば。 insert into my_table values('hi, my name''s tim.');
一重引用符は、例で示したように、それらを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.
単一引用符を別の単一引用符でエスケープしてもうまくいかない場合(最近の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
どうですか?
insert into my_table values('hi, my name'+char(39)+'s tim.')
見積もりを2倍にしてもうまくいくはずなので、うまくいかなかったのは独特です。ただし、別の方法としては、文字列の周囲に単一引用符ではなく二重引用符を使用することです。すなわち、
insert into my_table values("hi, my name's tim."
);
また、注意すべきもう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)と表示されます。
これを回避する2つの方法:
'
の場合は、文字列の中で2倍にすることができます。 select 'I''m happpy' -- will get: I'm happy
どの文字についても確信が持てません。SQLサーバではselect unicode(':')
によってcharのUnicodeを取得できます。
だからこの場合あなたはまたselect 'I'+nchar(39)+'m happpy'
することができます
挿入するものの前に 'を挿入するだけです。 sqlServerのエスケープ文字のようになります
例:I'm fineのようなフィールドがある場合。 UPDATE my_table SET row = 'I''m fine。';
これはうまくいくはずです
DECLARE @singleQuote CHAR
SET @singleQuote = CHAR(39)
insert into my_table values('hi, my name'+ @singleQuote +'s tim.')
これは動作するはずです。バックスラッシュを使用し、二重引用符を付けます。
"UPDATE my_table SET row =\"hi, my name's tim.\";