我在用户定义的标量函数中有以下SQL查询:
declare @csv varchar(8000)
select @csv =
COALESCE(@csv + ', ' + CAST(CallID as varchar(10)),
CAST(CallID as varchar(10)))
from calls
where 1=1 --@csv = '6097'
callid = callid --@csv = '1, 2, 3'...
callid <= 10000 --always true, expected result (@csv = '1, 2, 3'...)
order by callid
select @csv
如果我使用1 = 1 where where条件,我得到@csv ='6097'(表中的最大CallID)。如果我使用callid = callid,callid&lt; = 10000,我得到了预期的结果:@csv ='1,2,3,'...如果我删除WHERE或ORDER BY子句,这也是结果。
有没有人知道为什么会这样?我有另一种情况发生,但功能有点复杂。我创建了一个全新的表,其中一个ID为int null null主键字段,填充1-6097,并尝试上面的查询,它从未给我'6097'的意外结果。这是我在SQL Server中遇到的最令人困惑的问题,所以如果有人有指示我的方向,我会非常感激。谢谢!
答案 0 :(得分:2)
你的callid列在倒数第二行返回NULL。这会导致累加器在1 = 1的情况下重置,并导致callid = callid在另一种情况下失败(因为NULL = NULL为False)。
解决方案是将你的callid用法包装在COALESCE Calls中。