Sql Server 2008:存储过程中的奇怪错误

时间:2013-09-16 11:59:04

标签: sql sql-server sql-server-2008 stored-procedures

我正在尝试运行以下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项包含一个变量,作为标识列位置的表达式的一部分。只有在引用列名的表达式进行排序时,才允许使用变量。

任何人都可以看看,告诉我这里我做错了什么+我怎么能让这个工作?

3 个答案:

答案 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