以下是帮助理解问题的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.
答案 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
子句(以及WHERE
,GROUP BY
,HAVING
和FETCH
/ TOP
子句)确实确定了哪些行被退回。 (SELECT TOP 0 NULL)
被用作标量子查询。如果它没有返回任何内容,那么SQL会输入NULL
,因此会大大简化您的查询。
另外,我怀疑在这种情况下确实需要UNION
。它会导致删除重复项的开销。作为习惯问题,最好学会使用UNION ALL
,除非你真的想要承担开销。