SQL Server 2005 Standard 9.0.3233 を再起動した後、テーブルの特定の列からテーブル変数に挿入しようとする一部のストアド プロシージャで上記のエラーが発生しました。ベース テーブルには varchar(10) として定義された列がありますが、テーブル変数には挿入される列が varchar(3) としてのみ定義されています。ただし、SELECT ステートメントは 3 文字以下のデータのみを返します。
データやコード ベースを他の方法で変更したことはありません。これは運用サーバーでのみ発生しています。同じ SQL Server 2005 エディションがインストールされているが、古いバックアップがインストールされているテスト サーバーで同じクエリを実行すると、エラーは発生しません。INSERT が削除された場合、またはベース テーブルと一致するようにテーブル変数列が拡張された場合、両方のクエリで同じデータが返されます。
私が気付いたのは、2 つのサーバーで同じクエリを実行すると、実行計画が異なるということです。クエリが機能するサーバーには、列を取得して varchar(3) への暗黙的な変換を行う計算されたスカラー操作があり、その後、ネストされたループ結合操作に出力されます。
エラーを返すサーバーでは、代わりにベース テーブルのハッシュ結合とテーブル スキャンがあります。フルスキャンの使用を含め、関連するすべてのテーブルのインデックスを再構築し、統計を更新しようとしましたが、動作するサーバーと同じ stat_stream を使用しましたが、同じ計画を取り戻すことはできません。
今のところ、テーブル変数列のサイズを変更することで壊れていたいくつかのストアド プロシージャを修正しましたが、統計とインデックスを元に戻して以前と同じプランを生成する方法があるかどうかを知りたいです。まだ実行されていないコードが他にもある場合に備えて。