SQL Server 2008で誤解を招くエラーに遭遇しましたが、私に何が起こっているのかを誰かが説明できるでしょうか。
私は次のようなストアドプロシージャを持っています:
declare @cross_reference table (
context varchar(20) not null
, value1 varchar(10) not null
, value2 varchar(10) not null
)
insert into @cross_reference values ('map', 'from_value', 'to_value')
insert into @cross_reference values ('map', 'from_value', 'to_value')
insert into @cross_reference values ('map', 'from_value_xxxxx', 'to_value_xxxxxxx')
select
t1.field1
, t1.field2
, xref.value2
from table_1 t1
inner join table_2 t2 on t2.id = t1.id
left join @cross_reference xref on xref.context = 'map' and xref.value1 = t2.map_id
実際のストアドプロシージャはもっと複雑ですが、これが要点です。
SPを実行すると、「文字列またはバイナリデータが切り捨てられる」というエラーが発生する前に、大量の出力行が表示されます。エラー内の特定の行参照は、上記のメインSELECTステートメントのどこかを指していますが、しばらくデバッグした後、最初に相互参照に入力した値が大きすぎることがわかり、それで修正されました。
しかし、私の質問は次のとおりです。
SQL Serverは、相互参照行の挿入を完了せずに、メインのSELECTステートメントをどのように実行しましたか?ある種の遅延処理はありますか?テーブル変数の遅延読み込み?
いったいなぜ「文字列またはバイナリデータが切り捨てられる」というメッセージが実際に発生している場所を指していないのでしょうか。それとも私はそれを間違っていますか?
ありがとう、レイ
編集
これは、テーブル変数へのLEFT JOINと関係があり、その列はいずれもWHERE句に含まれていないと思います。SQL Serverは、必要になるまで(INNER JOINが完了した後)テーブルの準備を残しているようで、その時点で、結果セットの大部分をSELECTの準備ができているときにエラーが発生しました。
@cross_referenceに正常に挿入された値が、返される結果セットに表示されることにも気づきました。大きすぎるために挿入に失敗した行はNULLを表示するだけです。