2

我在用户定义的标量函数中有以下 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 条件,我会得到 @csv = '6097' (表中的最大 CallID)。如果我使用 callid=callid, callid <= 10000,我会得到预期的结果:@csv = '1, 2, 3, '... 如果我删除 WHERE 或 ORDER BY 子句,这也是结果。

有谁知道为什么会发生这种情况?我有另一个案例发生,但功能有点复杂。我创建了一个带有一个 ID 非空主键字段的全新表,用 1-6097 填充它,并尝试了上面的查询,它从来没有给我“6097”的意外结果。这是我在使用 SQL Server 时遇到的最令人困惑的问题,因此,如果有人能指出我的方向,我将不胜感激。谢谢!

4

1 回答 1

2

您的 callid 列在倒数第二行返回 NULL。这会导致您的累加器在 1=1 的情况下重置,并导致 callid=callid 在另一种情况下失败(因为 NULL=NULL 为 False)。

解决方案是将您的 callid 用法也包含在 COALESCE Calls 中。

于 2013-11-02T23:37:32.363 回答