我正在尝试运行以下sql server存储过程,而我无法让它执行。过程查询是:
ALTER PROCEDURE [dbo].[get_StockNavigationReportData]
@startDate VARCHAR(200),
@endDate VARCHAR(200),
@groupBy VARCHAR(200)
AS
BEGIN
SELECT M.VRNOA, M.VRDATE 'DATE', M.REMARKS, D.qty 'QTY', g2.name 'Godown_2', g.name 'Godown_1'
FROM
Stockmain M, StockDetail D, GODOWN G, (
SELECT * FROM GODOWN
) AS g2
WHERE
M.Etype='navigation'
AND M.STID = D.STID
AND D.GODOWN_ID = G.GODOWN_ID
AND g2.godown_id = D.GODOWN_ID2
AND VRDATE BETWEEN CONVERT(VARCHAR, CAST(@startDate AS DATETIME),101)
AND CONVERT(VARCHAR, CAST(@endDate AS DATETIME), 101)
ORDER BY
@groupBy ASC
END
我得到的错误是:
Msg 1008,Level 16,State 1,Procedure get_StockNavigationReportData,Line 25
由ORDER BY编号1标识的SELECT项包含一个变量,作为标识列位置的表达式的一部分。只有在引用列名的表达式进行排序时,才允许使用变量。
任何人都可以看看,告诉我这里我做错了什么+我怎么能让这个工作?
答案 0 :(得分:5)
您不能在order by
子句中使用变量。相反,你必须做类似的事情:
order by (case when @groupBy = 'VRNOA' then VRNOA
. . .
end)
但要小心,因为如果列的类型不同,可能会发生意外情况或可能会出现另一个错误。 (有一种替代方法可以使用动态SQL,但我不建议这样做。)
此外,名称@groupby
有点误导。 “分组”是一个等同于“聚合”的SQL术语。 @OrderBy
或@SortBy
不合适吗?
答案 1 :(得分:2)
您无法通过这种方式订购变量。
如果你想这样做,建立一个动态查询字符串,然后执行它。
类似的东西:
declare @sql varchar(4000)
set @sql = 'select * from tablename order by ' + @orderbyclause + ' ASC'
exec (@sql)
答案 2 :(得分:1)
是的,您不能在order by子句中使用变量来指定订单位置。 http://exacthelp.blogspot.com/2012/03/how-to-use-variable-in-order-by-clause.html
你应该写这样的东西:
ORDER BY
CASE
WHEN @groupBy = 1 THEN VRNOA
WHEN @groupBy = 2 THEN DATE
WHEN @groupBy = 3 THEN REMARKS
...............
............
END