2017-05-17 2 views
0

Dies ist mein erster Beitrag in einem Forum um Hilfe mit SQL. Ich habe immer die Antwort gefunden, die ich brauche (normalerweise auf dieser Seite).CURSOR mit Aktualisierungsspalte Name Variable

Ich habe einen Cursor mit einem variablen Spaltennamen und einer WHERE-Klausel, die den Spaltennamen enthält.

Kann mir jemand sagen, warum es heißt, viele Zeilen wurden aktualisiert, aber meine Daten ändern sich nie? #WHold ist eine temporäre Tabelle, die die Spaltennamen enthält, die ich durchlaufen muss. Es bezieht sich auch auf den Zeilendatenwert. Ich könnte eine Pivot-Tabelle verwenden, aber ich bin neugierig, warum dieser Cursor nicht funktioniert.

Wenn ich eine Update-Anweisung ausführen, werden die Zeilen aktualisiert.

--- Meine Update-Anweisung ---

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' 

--- Meine 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 

--- Ergebnisse von Cursor obwohl keine der Daten in das geändert wurde MyData --- Tabelle

(531 Zeile (n) betroffen)

(8 Zeile (n) betroffen)

(2757 Zeile (n) betroffen)

(1 Zeile (n) betroffen)

(2 Zeile (n) betroffen)

(1 Zeile (n) betroffen)

(14 Zeilen (n) betroffen)

(461 Zeile (n) betroffen)

(511 Zeile (n) betroffen)

(17 Zeile (n) betroffen)

(9 Zeile (n) betroffen)

(3 Zeile (n) betroffen)

Danke

Antwort

0

Die SQL der Aktualisierung wird Wert von @MTColumnName, versuchen Sie, Ihre Abfrage zu ändern:

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

Das hat funktioniert! Vielen Dank! Als Antwort markiert :) – Fred