10

私はSQLServer2005でかなり奇妙な問題に悩まされています。

「レコードを挿入するときにSETQUOTEDIDENTIFIERをオンにする必要があります」

(SPとして使用)特定のテーブルに。これは以前は正常に機能していましたが、このエラーをランダムにスローしています。

SPを確認しました。内部でSETQUOTEDIDENTIFIER設定を手動で指定しなかったため、デフォルトでオンにする必要があります。

誰かが問題の可能性を明確にすることができますか?

テーブルは、SET QUOTED IDENTIFIER ONで作成する必要がありますか?テーブルスクリプトはまだチェックしていません。

この問題は、日付列(modifiedAt)で挿入または更新を実行しているSPでのみ発生することを確認しました...サンプル値は「2009-08-1006:43:59:447」です。

渡された値に問題はありますか?

4

4 に答える 4

26

長い苦労の末、私たちはこの問題を解決することができました。理由を共有したかっただけです。

ビルドチームは、スクリプトを展開するための個別の社内ツールを維持しています。このツールは、SQLCMD(シェル)ユーティリティを内部的にトリガーして、データベース内のT-SQLスクリプトを実行します。

原因は次のとおりです。デフォルトでQUOTED_IDENTIFIEROFF、SQLCMDモードで実行している場合です。

このツールで実行されるすべてのスクリプトは、で作成されQUOTED IDENTIFIER OFFます。インデックス付きビューを使用するモジュールは私たちだけです。私の以前の投稿であなたがよく知っている残りのすべての物語:(

注:私はみんなの投稿を有用だと投票します。

于 2009-08-12T12:02:58.393 に答える
5

ストアドプロシージャのスクリプトを作成し、SETオプションを確認/変更し、ALTER PROCを実行して、SET QUOTEDIDENTIFIERONが設定されていることを確認します。

なんで?

「SETQUOTEDIDENTIFIER」の設定は、ストアドプロシージャの作成時に定義され、テーブルの場合は常に「オン」になります。ソース、BOL

テーブルが作成されると、テーブルの作成時にオプションがOFFに設定されていても、QUOTEDIDENTIFIERオプションは常にテーブルのメタデータにONとして格納されます。

ストアドプロシージャが作成されると、SETQUOTED_IDENTIFIERおよびSETANSI_NULLS設定がキャプチャされ、そのストアドプロシージャの後続の呼び出しに使用されます。

接続のデフォルトは、サーバーレベル(sp_configure'ユーザーオプション')またはデータベースレベル(ALTER DATABASE)で定義できます。SSMSの場合は、[ツール..オプション..クエリ実行..SQLServer..ANSI]の下にあります。これは、クライアントライブラリのデフォルトでもあります(DB-LIbを除く)。

ここで、SSMSクエリウィンドウを開いて「CREATEPROC ..」と入力し始めると、コードを実行するときにSSMS設定が使用されます。

また、SET QUOTED IDENTIFIERは、ストアドプロシージャ内で実行時に設定することはできません。同意しない前にリファレンスを見せてください...上記のMSBOLリンクから:

ストアドプロシージャ内で実行する場合、SETQUOTED_IDENTIFIERの設定は変更されません。

これをオフにしてコードを実行するには、一生懸命努力する必要があります...したがって、最も可能性の高い修正は、ストアドプロシージャをALTERまたは再作成することです。

于 2009-07-16T14:22:36.427 に答える
1

SQL Server 2005では、SET QUOTED IDENTIFIERはデフォルトでオフであり、オンではありません(ODBCまたはOLE接続を使用している場合を除く...詳細については、これを参照してください)。

使用するためにSETQUOTEDIDENTIFIERONでテーブルを作成する必要はありません。

SPの先頭にSETQUOTEDIDENTIFIER ONを追加して、プロシージャの実行を有効にするだけです(また、オンのままにしたくない場合は、SET QUOTEDIDENTIFIEROFFに切り替えてください。それを元に戻します)。

編集

私は正直に立っています。このMSDNページによると、SET QUOTED IDENTIFIERはデフォルトでオンになっています(DB-Libraryアプリケーションとの接続がない場合)。

于 2009-07-16T14:11:17.760 に答える
1

Erland Sommarskog、The Curse and Blessings of Dynamic SQLによるこの記事を読んでいたところ、SETQUOTEDIDENTIFIER設定に関する次の段落が含まれています。

この設定のデフォルトはコンテキストによって異なりますが、推奨される設定はONであり、XQuery、インデックス付きビュー、および計算列のインデックスを使用するには、ONにする必要があります。

ストアドプロシージャは、XQuery、インデックス付きビュー、または計算列のインデックスを使用していますか?

于 2009-07-16T14:15:38.670 に答える