2017-05-17 23 views
0

这是我在任何论坛上的第一篇文章,要求帮助SQL。我总是通过搜索找到我需要的答案(通常在本网站上)。CURSOR与更新列名变量

我有一个游标,其中包含列名称的变量列名和where子句。

有人可以告诉我为什么说很多行已更新,但我的数据从未改变? #WHold是一个临时表,它包含我需要循环访问的列名。它也涉及行数据值。我可以使用数据透视表,但我很好奇为什么这个游标不起作用。

如果我运行更新语句,行更新。

---我的Update语句---

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 

---从游标结果虽然没有数据的改变表迈德特---

(531行(一个或多个)受影响)

(8行(一个或多个)受影响)

(2757行(一个或多个)受影响)

(1行(一个或多个)受影响)

(受影响2行(S))

(1行(一个或多个)受影响)

(14行(一个或多个)受影响)

(461行(一个或多个)受影响)

(511行(一个或多个)受影响)

(17行(S)的影响)

(9行(S)的影响)

(3列(S)的影响)

谢谢

回答

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 
+0

工作正常!谢谢!标记为答案:) – Fred