我在SQL Server 2008中遇到了一個誤導性的錯誤,我想知道有沒有人可以解釋發生在我身上的事情?奇怪的SQL Server表的變量延遲加載?
我有一個存儲過程是這樣的:
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服務器執行主SELECT語句,而無需插入完成交叉引用行?是否有某種延遲處理?表變量的延遲加載?
爲什麼地球上「字符串或二進制數據將被截斷」的消息不是指向它實際發生的地方?還是我做錯了?
感謝, 雷
編輯
我覺得一定有什麼做的LEFT JOIN表中的變量,並且沒有它的列所涉及的WHERE子句。 SQL Server似乎已經將表的準備工作留在了需要的地方(INNER JOINs完成之後),並且在該點已經將大部分結果集準備就緒時出現錯誤。
我也注意到,成功插入到@cross_reference中的值確實顯示在返回的結果集中。而無法插入太大的行只顯示NULL。
我試着用ANSI_WARNINGS明確地打開,但它的行爲方式完全相同。我在上面添加了更多細節。 – Ray
在INSERT之後立即執行「SELECT * FROM @TableVar」來暫存內容?怎麼了?我有點難過,所以試圖建議我如何進行診斷。 – AdaTheDev