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

Kam*_*med 0 sql sql-server stored-procedures sql-server-2008

我试图运行以下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
Run Code Online (Sandbox Code Playgroud)

而我得到的错误是:

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

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

Gor*_*off 5

您不能在order by子句中使用变量.相反,你必须做以下事情:

order by (case when @groupBy = 'VRNOA' then VRNOA
               . . .
          end)
Run Code Online (Sandbox Code Playgroud)

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

此外,这个名字@groupby有点误导."分组"是一个等同于"聚合"的SQL术语.会不会@OrderBy@SortBy更合适?