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

时间:2015-11-24 15:09:01

标签: sql sql-server null output is-empty

以下是帮助理解问题的FonzSummary:正确:http://imgur.com/5eLJCgv,错误:http://imgur.com/a0Ssp0e

问题: 我在显示空输出方面遇到了一些问题......如果没有结果,我 想要 输出完全没有反映,但到目前为止,我一直没有成功。< / p>

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'

为了进一步复杂化,一旦我添加(选择TOP 0 NULL)到我的proc,有效结果就不再起作用了!为什么这会尝试转换为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.

1 个答案:

答案 0 :(得分:0)

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

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

THEN (SELECT TOP 0 NULL)语句中的CASE是尝试不获取任何行的勇敢尝试。但是,FROM子句(以及WHEREGROUP BYHAVINGFETCH / TOP子句)确实确定了哪些行被退回。 (SELECT TOP 0 NULL)被用作标量子查询。如果它没有返回任何内容,那么SQL会输入NULL,因此会大大简化您的查询。

另外,我怀疑在这种情况下确实需要UNION。它会导致删除重复项的开销。作为习惯问题,最好学会使用UNION ALL,除非你真的想要承担开销。