0

我正在尝试运行以下 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

我得到的错误是:

消息 1008,级别 16,状态 1,过程 get_StockNavigationReportData,第 25 行
由 ORDER BY 编号 1 标识的 SELECT 项包含一个变量,作为标识列位置的表达式的一部分。只有在通过引用列名的表达式进行排序时才允许使用变量。

任何人都可以看看并告诉我我在这里做错了什么+我怎样才能让它工作?

4

3 回答 3

5

您不能在order by子句中使用变量。相反,您必须执行以下操作:

order by (case when @groupBy = 'VRNOA' then VRNOA
               . . .
          end)

但是要小心,因为如果列的类型不同,则可能会发生意外的事情或可能会出现另一个错误。(有使用动态 SQL 的替代方法,但我不建议这样做。)

另外,这个名字@groupby有点误导。“分组”是一个等同于“聚合”的 SQL 术语。会不会@OrderBy@SortBy合适?

于 2013-09-16T12:01:58.863 回答
2

您不能以这种方式按变量排序。

如果您想这样做,请构建一个动态查询字符串,然后执行它。

就像是:

declare @sql varchar(4000)

set @sql = 'select * from tablename order by ' + @orderbyclause + ' ASC'
exec (@sql)
于 2013-09-16T12:02:15.593 回答
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
于 2013-09-16T12:08:49.347 回答