2010-03-04 56 views
10

嗨,我有一個存儲過程,在那裏我做一個選擇查詢。 我想要通過外部參數來訂購。按參數排序

我發佈一個小例子:

CREATE PROCEDURE [dbo].[up_missioni_get_data] 
@order VarChar(100) 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for procedure here 
    SELECT * from missioni ORDER BY ... 
END 

我可以爲了通過寫什麼呢?

感謝

+1

如何返回未排序的數據集並將結果排序在代碼中? –

+0

您傳入的外部參數將是靜態的,那麼您如何通過它來訂購? – NibblyPig

回答

8

你有2個選擇,要麼使用CASE語句,或使用動態SQL

這將是CASE語句

DECLARE @Table TABLE(
     Col1 VARCHAR(10), 
     Col2 VARCHAR(10) 
) 

DECLARE @OrderBy VARCHAR(100) 

SET @OrderBy = 'Col1' 

SELECT * 
FROM @Table 
ORDER BY 
     CASE 
      WHEN @OrderBy = 'Col1' THEN Col1 
      WHEN @OrderBy = 'Col2' THEN Col2 
      ELSE Col1 
     END 

的一個例子,這將是與例如動態SQL

CREATE TABLE #Table (
     Col1 VARCHAR(10), 
     Col2 VARCHAR(10) 
) 

DECLARE @OrderBy VARCHAR(100) 

SET @OrderBy = 'Col1' 

DECLARE @SqlString NVARCHAR(MAX) 

SELECT @SqlString = 'SELECT * FROM #Table ORDER BY ' + @OrderBy 

EXEC(@Sqlstring) 

DROP TABLE #Table 
+4

+1第一個受保護或再次保護sql注入 – garik

+0

如果使用Case/When方法,每個列都具有相同的數據類型非常重要。 SQL在編譯時評估Case/When表達式的結果數據類型,並使用數據類型優先級來確定輸出數據類型。嘗試將整數列與DateTime列混合,你會明白我的意思。 –

2

另一個選項是對要排序的列使用表達式。

DECLARE @OrderBy INT 

SET @OrderBy = 4 

SELECT  * 
FROM   MySourceTable 
ORDER BY COL_NAME(OBJECT_ID('MySourceTable'), @OrderBy) 

如果可以的話,通常最好避免使用動態sql。