我在 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 完成之后),并且当它已经准备好要选择的大部分结果集时出错。
我也注意到成功插入到@cross_reference 中的值确实显示在返回的结果集中。而因太大而无法插入的行只显示 NULL。