在存储过程中按顺序变量
VARIABLE IN ORDER BY IN STORED PROCEDURE
我试图在存储过程中按子句对变量进行排序,但返回错误。
代码如下;
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.'
无法在order by
子句中使用variable
,您需要为您的查询创建一个字符串,然后通过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
正如 Reza 所说,您无法通过这种方式完成它。一种方式可以是动态的 SQL 但还有其他选择。动态 SQL 也有一些陷阱,你必须在使用它之前稍微计划一下(还要注意 SQL 注入攻击!)。
您可以关注这篇 link 一篇关于条件 SQL(包括条件排序)
的各种技巧的精彩而广泛的文章
对于一小组候选订单;
ORDER BY
CASE @ORDER WHEN 1 THEN fld1 END,
CASE @ORDER WHEN 2 THEN fld2 END,
CASE @ORDER WHEN 3 THEN fld3 END
您可以在 ORDER BY 子句中执行类似的操作,但我认为您的 WHERE 子句仍然会遇到一些问题。
ORDER BY
CASE @ORDER
WHEN 'columnname1' THEN columnname1
WHEN 'columnname2' THEN columnname2
END
我试图在存储过程中按子句对变量进行排序,但返回错误。 代码如下;
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.'
无法在order by
子句中使用variable
,您需要为您的查询创建一个字符串,然后通过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
正如 Reza 所说,您无法通过这种方式完成它。一种方式可以是动态的 SQL 但还有其他选择。动态 SQL 也有一些陷阱,你必须在使用它之前稍微计划一下(还要注意 SQL 注入攻击!)。
您可以关注这篇 link 一篇关于条件 SQL(包括条件排序)
的各种技巧的精彩而广泛的文章对于一小组候选订单;
ORDER BY
CASE @ORDER WHEN 1 THEN fld1 END,
CASE @ORDER WHEN 2 THEN fld2 END,
CASE @ORDER WHEN 3 THEN fld3 END
您可以在 ORDER BY 子句中执行类似的操作,但我认为您的 WHERE 子句仍然会遇到一些问题。
ORDER BY
CASE @ORDER
WHEN 'columnname1' THEN columnname1
WHEN 'columnname2' THEN columnname2
END