我有一个参数
@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]
有什么想法吗?参数值是动态生成的。
答案 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()
。
这是一个完整的代码:
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。