在存储过程中按顺序变化

时间:2015-02-04 15:54:38

标签: sql-server tsql stored-procedures

我试图在存储过程中将变量放在order by子句中,但它返回错误。 代码如下;

SELECT ...
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.SQL_HANDLE) AS st
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qp
WHERE @where LIKE '%'+@search+'%'
ORDER BY CASE @ORDER

错误是;

'Msg 1008, Level 16, State 1, Procedure sp_ExecInfo2, Line 40
The SELECT item identified by the ORDER BY number 1 contains a variable as part of the expression identifying a column position. Variables are only allowed when ordering by an expression referencing a column name.'

4 个答案:

答案 0 :(得分:3)

对于一小组候选订单;

ORDER BY 
  CASE @ORDER WHEN 1 THEN fld1 END,
  CASE @ORDER WHEN 2 THEN fld2 END,
  CASE @ORDER WHEN 3 THEN fld3 END

答案 1 :(得分:1)

您可以在ORDER BY子句中执行类似的操作,但我认为您的WHERE子句仍然存在一些问题。

ORDER BY 
        CASE @ORDER
            WHEN 'columnname1' THEN columnname1
            WHEN 'columnname2' THEN columnname2
        END

答案 2 :(得分:0)

无法在variable子句中使用order by,您需要为查询创建一个字符串,然后按sp_execute_sql执行

DECLARE @sql NVARCHAR(MAX)
SET @sql = 'SELECT ... '+
'FROM sys.dm_exec_query_stats AS qs '+
'CROSS APPLY sys.dm_exec_sql_text(qs.SQL_HANDLE) AS st '+
'CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qp '+
'WHERE '+@where+' LIKE ''%'+@search+'%'''+
'ORDER BY '+@order

EXEC sp_executesql @sql

答案 3 :(得分:0)

正如Reza所说,你不能这样做。一种方法可以是动态SQL,但还有其他选择。动态SQL也有一些陷阱,你必须先计划一下它(也要注意SQL注入攻击!)。

您可以点击此链接,阅读有关条件SQL的各种相关内容的大量文章(包括条件排序)

Dynamic Conditional SQL