2010-03-04 57 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。