4

SQL Server 2005 Standard 9.0.3233 を再起動した後、テーブルの特定の列からテーブル変数に挿入しようとする一部のストアド プロシージャで上記のエラーが発生しました。ベース テーブルには varchar(10) として定義された列がありますが、テーブル変数には挿入される列が varchar(3) としてのみ定義されています。ただし、SELECT ステートメントは 3 文字以下のデータのみを返します。

データやコード ベースを他の方法で変更したことはありません。これは運用サーバーでのみ発生しています。同じ SQL Server 2005 エディションがインストールされているが、古いバックアップがインストールされているテスト サーバーで同じクエリを実行すると、エラーは発生しません。INSERT が削除された場合、またはベース テーブルと一致するようにテーブル変数列が拡張された場合、両方のクエリで同じデータが返されます。

私が気付いたのは、2 つのサーバーで同じクエリを実行すると、実行計画が異なるということです。クエリが機能するサーバーには、列を取得して varchar(3) への暗黙的な変換を行う計算されたスカラー操作があり、その後、ネストされたループ結合操作に出力されます。

エラーを返すサーバーでは、代わりにベース テーブルのハッシュ結合とテーブル スキャンがあります。フルスキャンの使用を含め、関連するすべてのテーブルのインデックスを再構築し、統計を更新しようとしましたが、動作するサーバーと同じ stat_stream を使用しましたが、同じ計画を取り戻すことはできません。

今のところ、テーブル変数列のサイズを変更することで壊れていたいくつかのストアド プロシージャを修正しましたが、統計とインデックスを元に戻して以前と同じプランを生成する方法があるかどうかを知りたいです。まだ実行されていないコードが他にもある場合に備えて。

4

1 に答える 1

1

これは既知の動作であり、おそらく再起動とは関係ありません。実際に起こっていることは、オプティマイザがパフォーマンス上の理由からクエリの論理要素を並べ替えているということですが、これにより、句のフィルタリングの前に切り捨てエラー チェックが行われます。WHERE

推奨される解決策は、VARCHAR(3) に割り当てられる列式を、句CASE..の長さテストを複製する形でラップすることです。WHERE非論理的に聞こえるかもしれませんが、通常は問題を解決します。

于 2013-11-09T00:00:38.390 に答える