如何将输出设置为 EMPTY,当前显示 ROW

How to set output to be EMPTY, currently shows a ROW

这里有一个 FonzSummary 可以帮助理解问题 -- 正确:http://imgur.com/5eLJCgv, Incorrect: http://imgur.com/a0Ssp0e

问题: 我在显示空输出时遇到了一些问题...我 想要 如果没有结果,输出绝对不会反映任何内容,但到目前为止我一直没有成功。

SET @AddedOutput =
CASE WHEN @AddedList IS NULL THEN NULL
ELSE 'Kids added to Santas Naughty List'+@AddedNames
END

SET @RemovedOutput =
CASE WHEN @RemovedList IS NULL THEN NULL
ELSE 'Kids removed from Santas Naughty List'+@RemovedNames
END

--Final Output
SELECT CASE
WHEN @AddedOutput IS NULL THEN (SELECT TOP 0 NULL) 
ELSE @AddedOutPut END as 'List Changes'
UNION
SELECT CASE
WHEN @RemovedOutput IS NULL THEN (SELECT TOP 0 NULL) 
ELSE @RemovedOutput END as 'List Changes'

更复杂的是,一旦我将 (Select TOP 0 NULL) 添加到我的过程中,有效结果就不再起作用了!为什么这会让它尝试转换为 Int?我知道结果不会是 Int!

Msg 245, Level 16, State 1, Procedure SantaList_TEST, Line 72
Conversion failed when converting the varchar value 'Kids added 
to Santas Naughty List 27065, 28538, 28539' to data type int.

您有两个子查询,每个子查询 return 占一行。输出将有一行或两行。一种方法是:

SELECT t.*
FROM (SELECT @AddedOutPut as ListChanges
      UNION
      SELECT @RemovedOutput as ListChange
     ) t
WHERE ListChanges IS NOT NULL;

您的 CASE 语句中的 THEN (SELECT TOP 0 NULL) 是一次尝试不获取任何行的勇敢尝试。但是,FROM 子句(连同 WHEREGROUP BYHAVINGFETCH/TOP 子句)真正决定了哪些行是正在 returned。 (SELECT TOP 0 NULL) 被用作标量子查询。如果它没有 return 任何东西,那么 SQL 会输入 NULL,因此您的查询会得到彻底的简化。

此外,我怀疑在这种情况下是否真的需要 UNION。删除重复项会产生开销。作为习惯,最好学会使用UNION ALL,除非你真的想承担开销。