这是我在任何需要SQL帮助的论坛上发表的第一篇文章。我总是通过搜索找到我需要的答案(通常在这个网站上)。
我有一个带有变量列名的游标和一个包含列名的where子句。
有人可以告诉我为什么它说许多行已更新但我的数据从未改变过吗? #WHold是一个临时表,它包含我需要循环的列名。它还涉及行数据值。我可以使用数据透视表,但我很好奇为什么这个游标不起作用。
如果我运行更新语句,则会更新行。
---我的更新声明---
UPDATE MT
SET MT.[10004] = MTD.WHoldAmt
FROM dbo.MyData MT
INNER JOIN dbo.MyDataDetail MTD
ON MT.EEID = MTD.EEID AND MTD.WHold = '10004'
---我的CURSOR ---
DECLARE @ColumnName VARCHAR(100)
DECLARE @getColumnName CURSOR
DECLARE @MTColumnName VARCHAR(100)
SET @getColumnName = CURSOR FOR
SELECT WHold,'MT.['+WHold+']' FROM #Whold
OPEN @getColumnName
FETCH NEXT FROM @getColumnName INTO @ColumnName,@MTColumnName
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE MT
SET @MTColumnName = MTD.WHoldAmt
FROM dbo.MyData MT
INNER JOIN dbo.MyDataDetail MTD ON MT.EEID = MTD.EEID AND MTD.WHold = @ColumnName
FETCH NEXT
FROM @getColumnName INTO @ColumnName,@MTColumnName
END
CLOSE @getColumnName
DEALLOCATE @getColumnName
---光标的结果虽然表MyData ---
中没有更改任何数据(531行(s)受影响)
(8行(s)受影响)
(2757行(s)受影响)
(1行受影响)
(2行(s)受影响)
(1行受影响)
(14行(s)受影响)
(受影响的461行)
(511行(s)受影响)
(17行(s)受影响)
(9行受影响)
(3行受影响)
谢谢
答案 0 :(得分:0)
SQL正在更新@MTColumnName的值,尝试将您的查询更改为:
DECLARE @ColumnName VARCHAR(100)
DECLARE @getColumnName CURSOR
DECLARE @SQLUpdate VARCHAR(max) -- Variable to hold SQL Command
SET @getColumnName = CURSOR FOR
SELECT WHold FROM #Whold
OPEN @getColumnName
FETCH NEXT FROM @getColumnName INTO @ColumnName,@MTColumnName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQLUpdate = 'UPDATE MT SET MT.[' + @ColumnName + '] = MTD.WHoldAmt
FROM dbo.MyData MT INNER JOIN dbo.MyDataDetail MTD ON MT.EEID = MTD.EEID AND MTD.WHold = ''' + @ColumnName + ''''
exec @SQLUpdate
FETCH NEXT
FROM @getColumnName INTO @ColumnName,@MTColumnName
END
CLOSE @getColumnName
DEALLOCATE @getColumnName