更新列名变量

时间:2017-05-17 17:01:56

标签: sql-server tsql cursor

这是我在任何需要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行受影响)

谢谢

1 个答案:

答案 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