带有更新列名变量的 CURSOR
CURSOR with Update Column Name Variable
这是我第一次 post 在任何论坛上寻求有关 SQL 的帮助。我总是通过搜索(通常在这个网站上)找到我需要的答案。
我有一个带有可变列名的游标和一个包含列名的 where 子句。
谁能告诉我为什么它说很多行已更新但我的数据从未改变? #WHold 是一个临时文件 table,它包含我需要循环的列名。它还与行数据值有关。我可以使用枢轴 table 但我很好奇为什么这个光标不起作用。
如果我 运行 一个更新语句,行就会更新。
---我的更新语句---
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'
---我的光标---
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
---来自游标的结果虽然 none 的数据在 table MyData 中被更改---
(531 行受影响)
(8 行受影响)
(2757 行受影响)
(1 行受影响)
(2 行受影响)
(1 行受影响)
(14 行受影响)
(461 行受影响)
(511 行受影响)
(17 行受影响)
(9 行受影响)
(3 行受影响)
谢谢
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
这是我第一次 post 在任何论坛上寻求有关 SQL 的帮助。我总是通过搜索(通常在这个网站上)找到我需要的答案。
我有一个带有可变列名的游标和一个包含列名的 where 子句。
谁能告诉我为什么它说很多行已更新但我的数据从未改变? #WHold 是一个临时文件 table,它包含我需要循环的列名。它还与行数据值有关。我可以使用枢轴 table 但我很好奇为什么这个光标不起作用。
如果我 运行 一个更新语句,行就会更新。
---我的更新语句---
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'
---我的光标---
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
---来自游标的结果虽然 none 的数据在 table MyData 中被更改---
(531 行受影响)
(8 行受影响)
(2757 行受影响)
(1 行受影响)
(2 行受影响)
(1 行受影响)
(14 行受影响)
(461 行受影响)
(511 行受影响)
(17 行受影响)
(9 行受影响)
(3 行受影响)
谢谢
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