我试图理解下面的语法。我可以帮忙解决这个问题。
DECLARE @StringList VARCHAR(2500);
SELECT COALESCE(@StringList + ',','') + CAST(apID as VARCHAR) AS ApIdList FROM testTable
答案 0 :(得分:1)
因此,您将从apID
testTable
获取所有VARCHAR
COALESCE
检查第一个参数是否为NULL
,然后返回第二个参数。在此行@StringList
始终等于NULL
COALESCE(@StringList + ',','')
所以,NULL + ',' = NULL
,你会得到空字符串(''
)
然后empty string + CAST(apID as VARCHAR)
,您将apID
作为VARCHAR
答案 1 :(得分:1)
Coalesce返回提供的列表中提供的第一个非null元素。见 - https://msdn.microsoft.com/en-us/library/ms190349.aspx。
在你的情况下,如果@StringList不为null,那么它的内容将在testTable的每一行的appID前面加上逗号。
答案 2 :(得分:1)
您的代码返回ApID
作为表中所有行的字符串。为什么?因为@StringList
是NULL
所以第一个表达式求值为''
,第二个表达式求值为表中某行中ApId
的字符串表示形式。
我提醒您注意转换为VARCHAR
没有长度。不要这样做!默认长度因上下文而异,您可以在没有长度的情况下引入非常难以调试的错误。
我认为相关的表达更常见:
SELECT @StringList = COALESCE(@StringList + ',', '') + CAST(apID as VARCHAR(8000)) AS ApIdList
FROM testTable;
这会进行字符串连接,因此apID
的所有值都以逗号分隔的字符串连接在一起。
这样做是循环结果集以分配变量。不鼓励这种类型的变量跨多行分配。我不认为SQL Server保证它实际工作(即是一个记录的功能),但它似乎在所有版本的实践中都有效。