web-dev-qa-db-ja.com

SQL-Updateステートメントで単一引用符と二重引用符の両方を処理およびエスケープする方法

このサンプルT-SQLクエリを使用して、SQL-Server-2008でこれを試しています。

DECLARE nvarchar(1000) @wstring = "I asked my son's teacher, "How is my son doing now?"" 

UPDATE tablename SET columnname = ' " & @wstring & " ' where ... blah ... blah

上記のクエリはエラーをスローすることを知っています。

したがって、SQL-Updateステートメントで単一引用符と二重引用符の両方をどのようにエスケープ処理しますか。

すべての引用の前に「スラッシュ\」または単一引用符を手動で追加することを提案しないでください。

上記の例は単なるsAmpleであり、実際のアプリケーション値は1000文字を超えているため、これは非実用的です。これは他のシステムソースから受信されます。

20
MukeshAnAlsoRan

バックスラッシュで引用符をエスケープできます:

"I asked my son's teacher, \"How is my son doing now?\""
21

Sqlステートメントで2つの単一引用符を使用してエスケープします。二重引用符は問題になりません:

SELECT 'How is my son''s school helping him learn?  "Not as good as Stack Overflow would!"'

印刷:

How is my son's school helping him learn? "Not as good as Stack Overflow would!"

12
mclark1129

プログラミングする言語に応じて、関数を使用して二重引用符を2つの二重引用符に置き換えることができます。

たとえば、PHPの場合:

str_replace('"', '""', $string);

SQLのみを使用してこれを実行しようとしている場合は、おそらく REPLACE() が探しているものです。

したがって、クエリは次のようになります。

"UPDATE Table SET columnname = '" & REPLACE(@wstring, '"', '""') & "' where ... blah ... blah "
4
tany4

SET QUOTED_IDENTIFIERがOFFの場合、式内のリテラル文字列は、単一引用符または二重引用符で区切ることができます。

リテラル文字列が二重引用符で区切られている場合、文字列にはアポストロフィなどの埋め込み単一引用符を含めることができます。

2
tomf

「REPLACE」を使用して、特殊文字を削除します。

REPLACE(ColumnName ,' " ','')

例:-

-クエリ---

DECLARE @STRING AS VARCHAR(100)
SET @STRING ='VI''RA""NJA "'

SELECT @STRING 
SELECT REPLACE(REPLACE(@STRING,'''',''),'"','') AS MY_NAME

- 結果 - -

VI'RA "" NJA "

1

C#およびVBでは、SqlCommandオブジェクトは、この状況を処理するParameter.AddWithValueメソッドを実装します

0
user2145584

最初にテキストをExcelスプレッドシートにインポートし、次に置換関数を使用してSQL Serverの必要に応じて一重引用符と二重引用符の両方を置き換えることにより、同様の問題を解決しました。 SUBSTITUTE(SUBSTITUTE(A1、 "'"、 "' '")、 "" ""、 "\" "")

私の場合、多くの行があり(それぞれ1行のデータを削除してから挿入します)、置換が完了すると、スプレッドシートがテキストの挿入クエリを自動的に生成しました。 = "INSERT INTO [dbo]。[tablename]([textcolumn])VALUES( '"&SUBSTITUTE(SUBSTITUTE(A1、 "'"、 "''")、 "" ""、 "\" "")& " ') "

それがお役に立てば幸いです。

0
Frank Ray