将查询转换为动态时 GROUP BY 出错 SQL

Getting Error With GROUP BY when Converting Query to Dynamic SQL

我正在尝试将以下查询转换为动态 SQL 以允许变化:

UPDATE T
SET SumCount = J.SUM
FROM #temp T
    JOIN (SELECT Count_99221 + COUNT_99222 + Count_99223 [SUM], t2.userID
          FROM #temp t2
          GROUP BY t2.userID, Count_99221 + COUNT_99222 + Count_99223
          ) J ON T.userID = J.UserID

这就是我的动态 SQL:

DECLARE @sql3 nvarchar(2000) = 
'UPDATE T ' + 
'SET SumCount = J.SumOfColumns ' + 
'FROM #temp T ' + 
'JOIN (SELECT ' + @columnSumString + ' [SumOfColumns], t2.userID ' + 
'FROM #temp t2 ' + 
'GROUP BY t2.userID, ' + @columnSumString +
' ) J ON T.userID = J.UserID'

EXEC sp_executesql @sql3

仅当我 运行 查询为动态 SQL 时,我才收到以下错误:

Each GROUP BY expression must contain at least one column that is not an outer reference.

有人可以帮忙解释一下为什么会这样吗?我是 Dynamic SQL 的新手,所以我不知道以这种方式 运行ning 查询的任何限制。

提前致谢。

编辑:

变量@columnString 是通过连接其他几个列名而形成的字符串,创建方式如下:

DECLARE @Cursor Cursor
DECLARE @code varchar(20)
DECLARE @ID INT

SET @cptCursor = CURSOR FOR 
SELECT * FROM dbo.Split(@UserInput,CHAR(44))

OPEN @cptCursor
FETCH NEXT FROM @cptCursor INTO @ID, @code
WHILE @@FETCH_STATUS = 0
BEGIN

DECLARE @colName varchar(50) = 'Count_' + cast(@code as varchar(10))
DECLARE @sql nvarchar(50) = 'ALTER TABLE #temp ADD ' + @colName + ' int'
EXEC sp_executesql @sql

--Code that adds values to each column that is created.....

SET @columnSumString = @colName + ' + ' + @columnSumString
--SET @columnSumString = @code + ' + ' + @columnSumString

FETCH NEXT FROM @cptCursor INTO @ID, @code
END
CLOSE @Cursor
DEALLOCATE @Cursor

SET @columnSumString = SUBSTRING(@columnSumString,1,LEN(@columnSumString)-2)
SELECT @columnSumString

用户输入的是逗号分隔的字符串。 "Count_99221 + COUNT_99222 + Count_99223" 只是根据用户输入“99221、99222、99223”创建的列的一个示例。

我还意识到我正在将@code 变量连接到@columnSumString 而不是@colName。现在,当我 运行 查询时,我没有得到错误(即使我不明白上面的错误消息与那个错误有什么关系)但是 SumCount 的每个值都是 NULL。

恕我直言,您必须按如下方式重新编写查询:

UPDATE #temp
SET SumCount =
    (SELECT Count_99221 + COUNT_99222 + Count_99223
    FROM #temp t2
    WHERE t2.userID = #temp.userID)

因此动态 SQL 将变为:

DECLARE @columnString varchar(200)
SET @columnString = Count_99221 + COUNT_99222 + Count_99223

DECLARE @sql3 nvarchar(2000) = 
N'UPDATE #temp ' + 
'SET SumCount = (SELECT ' + @columnString +
    ' FROM #temp t2 WHERE t2.userID = #temp.userID)'

EXEC sp_executesql @sql3