我需要動態填充排名數字。即我會將列名作爲參數傳遞給過程,並且需要在Ranking函數中給出此參數。我寫了一個查詢,但不起作用。有什麼辦法,但沒有動態查詢和我需要的情況。查詢樣品低於動態排序依據排名函數
DECLARE @SortColumn VARCHAR(500) = 'name'
SELECT
ROW_NUMBER() OVER (ORDER BY @SortColumn) AS ID, EmpName, Salary
FROM Employee
我需要動態填充排名數字。即我會將列名作爲參數傳遞給過程,並且需要在Ranking函數中給出此參數。我寫了一個查詢,但不起作用。有什麼辦法,但沒有動態查詢和我需要的情況。查詢樣品低於動態排序依據排名函數
DECLARE @SortColumn VARCHAR(500) = 'name'
SELECT
ROW_NUMBER() OVER (ORDER BY @SortColumn) AS ID, EmpName, Salary
FROM Employee
查看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 ;
動態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
您需要動態SQL或大量的case語句。 –