2014-07-03 55 views
0

我需要動態填充排名數字。即我會將列名作爲參數傳遞給過程,並且需要在Ranking函數中給出此參數。我寫了一個查詢,但不起作用。有什麼辦法,但沒有動態查詢和我需要的情況。查詢樣品低於動態排序依據排名函數

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

您需要動態SQL或大量的case語句。 –

回答

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 ; 
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

+0

由於SQL注入,我沒有使用動態查詢。但是有一段時間,當我們使用案件的時間將會超過15個。有一件事我需要問,如果有超過10列然後哪個更好是CASE或動態查詢?哪個會更快? – Sreepathi

+0

性能方面,我認爲動態SQL會更快 - 但最終取決於您。編碼方式涉及一些額外的工作,但您必須比較兩種方法之間的性能。 CASE聲明的一個優點是您可以保證從中得到真正的結果,而不會受到拼寫錯誤或任何其他問題的影響。最終,只有在測試完兩個選項之後,您才能決定。 – AHiggins