Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Server 2008:存储过程中出现奇怪错误_Sql_Sql Server_Sql Server 2008_Stored Procedures - Fatal编程技术网

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

Sql Server 2008:存储过程中出现奇怪错误,sql,sql-server,sql-server-2008,stored-procedures,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.n

我正在尝试运行以下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,16级,状态1,程序get_StockNavigationReportData,第25行 由ORDER by number 1标识的SELECT项包含一个变量,作为标识列位置的表达式的一部分。仅当按引用列名的表达式排序时,才允许使用变量


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

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

order by (case when @groupBy = 'VRNOA' then VRNOA
               . . .
          end)
declare @sql varchar(4000)

set @sql = 'select * from tablename order by ' + @orderbyclause + ' ASC'
exec (@sql)
但是要小心,因为如果列的类型不同,可能会发生意外情况,或者可能会出现另一个错误。有一种替代方法可以使用动态SQL,但我不建议这样做


另外,@groupby这个名字有点误导人。分组是一个相当于聚合的SQL术语。@OrderBy或@SortBy不是更合适吗?

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

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

比如:

order by (case when @groupBy = 'VRNOA' then VRNOA
               . . .
          end)
declare @sql varchar(4000)

set @sql = 'select * from tablename order by ' + @orderbyclause + ' ASC'
exec (@sql)

是,您不能在order by子句中使用变量来指定订单位置。

你应该这样写:

ORDER BY 
        CASE 
WHEN @groupBy = 1 THEN VRNOA
WHEN @groupBy = 2 THEN DATE
WHEN @groupBy = 3 THEN REMARKS
...............
............
END

您不能按参数值排序,您需要处理列名..您需要的是