我有一个包含以下内容的存储过程。现在我需要针对几种不同场景的完全相同的程序,其中唯一的区别是不是"策略"我将参考另一栏。
为了避免编写多个存储过程,有没有办法可以使用变量输入来定义这个特定的列而不必使整个过程动态化?
INSERT INTO @temp
(
ranking,
item,
groupCount,
groupName
)
SELECT RANK() OVER(ORDER BY COUNT(*) desc, policy) [Rank],
policy,
COUNT(*) AS groupCount,
'currentMonth' AS groupName
FROM Log_PE
WHERE CONVERT(DATE, dateEsc, 120) >= CONVERT(DATE, CONVERT(VARCHAR(6), GETDATE(), 112) + '01', 112)
GROUP BY policy
ORDER BY groupCount desc, policy
非常感谢蒂姆的任何帮助。
答案 0 :(得分:1)
是的,您可以使用动态SQL来实现您的目标。首先,创建一个变量来保存将变化的列的名称。然后,创建另一个变量来保存动态生成的查询。最后,使用sp_executesql
运行此动态查询。代码看起来像这样:
declare @colname varchar(50) = ''
declare @query nvarchar(8000) = 'INSERT INTO @temp (ranking,item,groupCount,groupName)'
+ 'SELECT RANK() OVER(ORDER BY COUNT(*) desc,' + @colname + ') [Rank],' + @colname
+ 'COUNT(*) AS groupCount, 'currentMonth' AS groupName FROM Log_PE'
+ 'WHERE CONVERT(DATE, dateEsc, 120) >= CONVERT(DATE, CONVERT(VARCHAR(6), GETDATE(),112)
+ '01', 112)'
+ 'GROUP BY ' + @colname
+ ' ORDER BY groupCount desc, ' + @colname
execute sp_executesql @query