排名功能中的动态排序

时间:2014-07-03 15:10:07

标签: sql dynamic ranking

我需要动态填充排名。即我将列名称作为参数传递给过程,并需要在排名函数中给出此参数。我写了一个查询但是没有用。有任何方式,但我需要动态查询和案例。查询示例位于

之下
DECLARE @SortColumn VARCHAR(500) = 'name'
SELECT 
  ROW_NUMBER() OVER (ORDER BY @SortColumn) AS ID, EmpName, Salary
FROM Employee

2 个答案:

答案 0 :(得分:0)

看看Jeremiah Peschka的this blog post。基本上,您可以使用CASE语句使其正常工作。这是一种可能性:

SELECT  *
FROM (
    SELECT  ROW_NUMBER() OVER (
        ORDER BY CASE @SortOrder
            WHEN 'EmpName' THEN EmpName
            WHEN 'Salary' THEN Salary
            ELSE EmpId
        END DESC) AS rn,
        EmpId,
        EmpName,
        Salary
    FROM Employee
) AS x
ORDER BY rn ;

答案 1 :(得分:0)

动态SQL是这里最明显的选择 - 你构造一个字符串文字,连接你的参数,并执行整个事情。网上有很多文章可以帮到你,但基本语法是:

DECLARE @SortColumn VARCHAR(500) = 'name' 
DECLARE @SQL VARCHAR(MAX)

SET @SQL = 'SELECT ROW_NUMBER() OVER (ORDER BY ' + @SortColumn + ') AS ID, EmpName, Salary FROM Employee'

EXEC (@SQL)

在走这条路之前,你需要阅读一下动态SQL的优点和缺点 - 这可能是重读,但是you need to understand it.

如果您知道某些有限数量的列,则可以编写以下内容:

DECLARE @SortColumn VARCHAR(500) = 'name' 

SELECT ROW_NUMBER() OVER (ORDER BY 
    CASE 
        WHEN @SortColumn = 'name' THEN Name
        WHEN @SortColumn = 'bla' THEN Bla
        --- ... etc.
        ELSE 1
    END

        ) AS ID, EmpName, Salary FROM Employee

我个人会推荐第二个选项,因为动态SQL可以很快离开你,它会让你接触到令人讨厌的事情,比如SQL Injection