2017-05-17 35 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