在这个答案here中,该人开始使用以下代码块:
-- Build list of cols we want to unpivot (skip PID & UID)
declare @cols nvarchar(max)
select @cols = coalesce(@cols+N',', N'') + quotename(c.name) from syscolumns c
inner join sysobjects o on c.id = o.id and o.xtype = 'u'
where o.name = 'MyTable' and c.name not in ('PID', 'UID') order by c.colid
我正试图围绕如何以这种方式填充@cols。当我取出变量定义@cols =
时,它返回一个列表。当我取出coalesce()
并仅放置@cols+N','
时,select @cols
只是空。
有人能指出我的方向,我可以找到它是如何工作的吗?
答案 0 :(得分:2)
将其视为为循环中的变量赋值。为select
语句中的每一行分配变量。由于变量在每行之间保留其值,因此您可以创建一个从表行中提取的值的连接列表。
select @cols = @cols + N','
无效的原因是@cols
变量最初为NULL。将任何字符串连接到NULL的字符串时,结果也将为NULL。这就是您使用coalesce
的原因。或者,您可以将@cols
变量初始化为空字符串。