【问题标题】:Stored procedure :GROUP BY expression must contain at least one column that is not an outer reference存储过程:GROUP BY 表达式必须包含至少一列不是外部引用
【发布时间】:2018-04-03 01:02:46
【问题描述】:

我创建了一个存储过程。 @Sea 是用户的输出参数。在内联查询中它正在执行,但在存储过程中没有得到以下错误。

Create Procedure [dbo].[procedure name]
(
    @APTSeason NVARCHAR(1000),
    @rptsummary NVARCHAR(1000),
    @Sea NVARCHAR(1000)
)
AS
BEGIN

    SELECT (@Sea),
        Sum(ProjectedRevenue) as 'Total_$',
        Sum(TotalSalesUnits) as 'Total_U',


    From  table name

    group by @Sea
END
Go

错误:

每个 GROUP BY 表达式必须包含至少一列不是外部引用

【问题讨论】:

  • @Sea 的意义何在?似乎没有 group by 的查询是完全相同的(它只会返回一行,具有相同的数据,无论哪种方式),所以你可以摆脱 group by?
  • 我已经在选择列表中使用了@Sea,所以我需要使用 group by
  • 如果删除第一个 (@Sea) 周围的括号会怎样?
  • 我试过删除也没有改变同样的错误
  • 不用group by,去掉group by @Sea,保持SELECT (@Sea),不变,重试。

标签: sql sql-server stored-procedures


【解决方案1】:

我想你在找Dynamic SQL:

Create Procedure [dbo].[procedure name]
(
    @APTSeason NVARCHAR(1000),
    @rptsummary NVARCHAR(1000),
    @Sea NVARCHAR(1000)
)
AS
BEGIN

DECLARE @SQL VARCHAR(MAX)

SET @SQL = 'SELECT (' + QUOTENAME(@Sea) +'),
        Sum(ProjectedRevenue) as ''Total_$'',
        Sum(TotalSalesUnits) as ''Total_U'',


    From  table name

    group by ' + QUOTENAME(@Sea)

PRINT(@SQL)
--EXEC(@SQL)  --Comment this in if the previous "Print" outputs the correct SQL
END
Go

PS:如果在 SP 的任何地方都没有使用 @APTSeason@rptsummary,我认为这里不需要它们。

【讨论】:

    【解决方案2】:

    --GROUP BY CLAUSE 应该包括来自 SELECT 查询的列,不带任何文字或常量。

    您可以尝试以下步骤来解决问题:

    1. 使用 as 子句给 @set 一个别名。
    2. 删除具有@set 的group by 子句。

    它会给出没有错误的结果。

    【讨论】:

      猜你喜欢
      • 2012-05-31
      • 1970-01-01
      • 1970-01-01
      • 2014-06-18
      • 2020-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多