Sql Server 2008:存储过程中出现奇怪错误
我正在尝试运行以下sql server存储过程,但无法使其执行。查询的过程是: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
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
您不能按参数值排序,您需要处理列名..您需要的是