SQL Server:选择动态列

时间:2014-04-02 16:05:07

标签: sql sql-server stored-procedures dynamic dynamic-sql

我有一个包含以下内容的存储过程。现在我需要针对几种不同场景的完全相同的程序,其中唯一的区别是不是"策略"我将参考另一栏。

为了避免编写多个存储过程,有没有办法可以使用变量输入来定义这个特定的列而不必使整个过程动态化?

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

非常感谢蒂姆的任何帮助。

1 个答案:

答案 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