代码之家  ›  专栏  ›  技术社区  ›  user2571510

SQL Server:使用动态列选择

  •  0
  • user2571510  · 技术社区  · 11 年前

    我有一个包含以下部分的存储过程。现在,我需要对几个不同的场景采用完全相同的程序,其中唯一的区别是,我将引用另一列,而不是“策略”。

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

    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 回复  |  直到 11 年前
        1
  •  1
  •   shree.pat18    11 年前

    是的,您可以使用动态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