You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server:UNION ALL与字面量结合出现异常结果的问题排查

问题分析:为什么Union All结果里没有标记为'B'的行?

哈哈,这个小疏忽我一眼就看出来啦!你原本期望通过UNION ALL分别给@tblA和@tblB的数据打上'A'和'B'的标记,但执行后所有行的SourceFlag全是'A',完全看不到'B'的影子。

先看你的简化测试代码:

DECLARE @tblA TABLE(Id INT,SomeValue VARCHAR(100)); 
INSERT INTO @tblA VALUES (1,'blah'); 
DECLARE @tblB TABLE(Id INT,SomeValue VARCHAR(100)); 
INSERT INTO @tblA VALUES (2,'blub'); -- 这里就是核心错误!
SELECT 'A' AS SourceFlag, Id, SomeValue FROM @tblA 
UNION ALL 
SELECT 'B', Id, SomeValue FROM @tblB 

执行后返回的结果:

SourceFlag Id SomeValue 
A          1 blah 
A          2 blub 

你提到执行计划里确实生成了对应'A'和'B'的计算标量,也有Concatenation操作,但结果里就是没有'B'的行?

原因超级简单——你把本该插入@tblB的数据插到@tblA里了!看代码第四行的INSERT INTO @tblA VALUES (2,'blub');,这里应该写成INSERT INTO @tblB才对。因为这个疏忽,@tblB里根本没有任何数据,所以SELECT 'B', Id, SomeValue FROM @tblB这部分查询没有返回任何行,最终结果自然只有@tblA的两行,全部标记为'A'。

把INSERT语句改成INSERT INTO @tblB VALUES (2,'blub');再执行,就能得到你预期的结果:一行标记'A',一行标记'B'啦。

内容的提问来源于stack exchange,提问作者Gottfried Lesigang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:08:33