9のinsert
テーブルにテキストデータを挿入しようとしていますSQL Server
。
テキストには単一引用符( ')が含まれています。
どうすればそれを回避できますか?
単一引用符を2つ使用してみましたが、エラーが発生しました。
例えば。 insert into my_table values('hi, my name''s tim.');
9のinsert
テーブルにテキストデータを挿入しようとしていますSQL Server
。
テキストには単一引用符( ')が含まれています。
どうすればそれを回避できますか?
単一引用符を2つ使用してみましたが、エラーが発生しました。
例えば。 insert into my_table values('hi, my name''s tim.');
回答:
単一引用符は、例で示したように、二重引用符でエスケープします。次の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.')
引用の倍増はうまくいくはずだったので、うまくいかなかったのは奇妙です。ただし、代わりに、文字列を単一引用符ではなく二重引用符で囲みます。つまり、
insert into my_table values("hi, my name's tim."
);
また、注意が必要なもう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)として表示されます。
私たちの多くは、単一引用符をエスケープする一般的な方法は、以下のように簡単に二重引用符を二重にすることであることを知っています。
PRINT 'It''s me, Arul.';
単一引用符をエスケープする他のいくつかの代替方法を調べます。
1.UNICODE文字
39は、単一引用符のUNICODE文字です。以下のように使用できます。
PRINT 'Hi,it'+CHAR(39)+'s Arul.';
PRINT 'Helo,it'+NCHAR(39)+'s Arul.';
2.QUOTED_IDENTIFIER
別のシンプルで最適な代替ソリューションは、QUOTED_IDENTIFIERを使用することです。QUOTED_IDENTIFIERをOFFに設定すると、文字列を二重引用符で囲むことができます。このシナリオでは、一重引用符をエスケープする必要はありません。したがって、この方法は、単一引用符で多くの文字列値を使用する場合に非常に役立ちます。列の値に単一引用符が含まれているINSERT / UPDATEスクリプトの非常に多くの行を使用している間は、非常に役立ちます。
SET QUOTED_IDENTIFIER OFF;
PRINT "It's Arul."
SET QUOTED_IDENTIFIER ON;
結論
上記の方法は、AZUREとオンプレミスの両方に適用できます。
挿入するものの前に 'を挿入するだけです。sqlServerのエスケープ文字のようになります。
例:フィールドがある場合、私は元気です。あなたはできる:UPDATE my_table SET row = 'I''m fine。';
これは動作するはずです:バックスラッシュを使用して二重引用符を入れてください
"UPDATE my_table SET row =\"hi, my name's tim.\";
PRINT \"hi, my name's tim.\";
がSSMSでうまくいくと言っていますか?それはまったく機能せず、誰もそれが機能することをこれまでに言ったことがありません。