【问题标题】:Sql Server 2008: Strange error in stored procedureSql Server 2008:存储过程中的奇怪错误
【发布时间】:2013-09-16 11:59:04
【问题描述】:

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

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

【问题讨论】:

  • 你不能按参数值排序,你需要用列名..
  • 你需要的是Dynamic ORDER BY

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


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    你不能这样按变量排序。

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

    类似:

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

    【讨论】:

      【解决方案3】:

      是的,您不能在指定订单位置的 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-25
        • 1970-01-01
        • 1970-01-01
        • 2015-01-26
        • 2016-11-13
        • 1970-01-01
        • 2018-10-04
        • 1970-01-01
        相关资源
        最近更新 更多