如何在sql server中连接逗号分隔符

时间:2014-05-14 08:30:15

标签: sql-server-2008

我有一个参数

@Cols='[Development Opportunities],[Feedback and Coaching],[Goals and Targets Set]'

我想要的结果如下:

sum(isnull([Development Opportunities],0)) as [Development Opportunities],
sum(isnull([Feedback and Coaching],0)) as [Feedback and Coaching],
sum(isnull([Goals and Targets Set],0)) as [Goals and Targets Set]

有什么想法吗?参数值是动态生成的。

1 个答案:

答案 0 :(得分:0)

您可以使用dynamic sql执行此操作。所以你应该创建一个SQL语句并使用sp_executesql

运行它

首先,我们应该将此列表分隔为行,然后将它们与我们生成SQL语句所需的格式连接起来。我们可以使用XML SQL服务器功能执行这两项任务。

要将此字符串与我们使用nodes() Method of XML data type的元素分开。

要使用它,我们应该将此字符串转换为XML格式。只需将,替换为</X><X>

即可
DECLARE @X XML
SET @X = CAST('<X>'+REPLACE(@Cols,',','</X><X>')+'</X>' as XML)

然后使用nodes()将此字符串拆分为元素:

  SELECT a.c.value('data(.)', 'VARCHAR(100)') as fieldName
    FROM   @X.nodes('X') as a(c)

然后我们应该将结果集连接到一行,根据需要格式化它。我们使用XML PATH()

SELECT @SQL = STUFF
((SELECT ',sum(isnull('+fieldName+',0)) as '+ fieldName
    FROM  separatedTable
    FOR XML PATH(''), TYPE).value('.','NVARCHAR(max)')
,1,1,'')

现在格式化完整的SQL语句并运行它:

SET @SQL='SELECT '+@SQL+ ' FROM YOUR_TABLE'
EXECUTE sp_executesql @SQL

请注意,对于sp_executesql,命令行参数必须为NVARCHAR(),而不仅仅是VARCHAR()

SQLFiddle demo

这是一个完整的代码:

DECLARE @Cols varchar(100)
SET @Cols = '[Development Opportunities],[Feedback and Coaching],[Goals and Targets Set]'

DECLARE @SQL nvarchar(max)
DECLARE @X XML

SET @X = CAST('<X>'+REPLACE(@Cols,',','</X><X>')+'</X>' as XML)

;WITH separatedTable AS 
(
  SELECT a.c.value('data(.)', 'VARCHAR(100)') as fieldName
    FROM   @X.nodes('X') as a(c)
) 
SELECT @SQL = STUFF
((SELECT ',sum(isnull('+fieldName+',0)) as '+ fieldName
    FROM  separatedTable
    FOR XML PATH(''), TYPE).value('.','NVARCHAR(max)')
,1,1,'')

SET @SQL='SELECT '+@SQL+ ' FROM YOUR_TABLE'
EXECUTE sp_executesql @SQL

最后但并非最不重要:“运行时编译的Transact-SQL语句可以使应用程序暴露于恶意攻击,例如SQL注入”。所以你应该check your input parameter list to prevent injection