将查询转换为动态时 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
我正在尝试将以下查询转换为动态 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