我需要动态填充排名。即我将列名称作为参数传递给过程,并需要在排名函数中给出此参数。我写了一个查询但是没有用。有任何方式,但我需要动态查询和案例。查询示例位于
之下DECLARE @SortColumn VARCHAR(500) = 'name'
SELECT
ROW_NUMBER() OVER (ORDER BY @SortColumn) AS ID, EmpName, Salary
FROM Employee
答案 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