Frage

Gibt es eine Möglichkeit Updates auf einer geschwenkten Tabelle in SQL Server 2008 auszuführen, wo die Änderungen zurück in die Quelltabelle propagieren, vorausgesetzt, es gibt keine Aggregation?

War es hilfreich?

Lösung 2

Dies wird nur dann wirklich funktionieren, wenn die geschwenkten Spalten eine eindeutige Kennung bilden. Also lassen Sie uns Buggy Beispiel nehmen; hier ist die Original-Tabelle:

TaskID    Date    Hours

und wir wollen es in eine Tabelle schwenken, die wie folgt aussieht:

TaskID    11/15/1980    11/16/1980    11/17/1980 ... etc.

Um die Pivot zu erstellen, würden Sie so etwas tun:

DECLARE @FieldList NVARCHAR(MAX)

SELECT
    @FieldList =
    CASE WHEN @FieldList <> '' THEN 
        @FieldList + ', [' + [Date] + ']' 
    ELSE 
        '[' + [Date] + ']' 
    END
FROM
    Tasks



DECLARE @PivotSQL NVARCHAR(MAX)
SET @PivotSQL = 
    '
        SELECT 
            TaskID
            , ' + @FieldList + '
        INTO
            ##Pivoted
        FROM 
            (
                SELECT * FROM Tasks
            ) AS T
        PIVOT
            (
                MAX(Hours) FOR T.[Date] IN (' + @FieldList + ') 
            ) AS PVT
    '

EXEC(@PivotSQL)

Also dann haben Sie Ihren geschwenkt Tisch in ##Pivoted. Jetzt führen Sie ein Update auf eine der Stunden Felder:

UPDATE
    ##Pivoted
SET
    [11/16/1980 00:00:00] = 10
WHERE
    TaskID = 1234

Jetzt ##Pivoted hat eine aktualisierte Version der Stunden für eine Aufgabe, die sich am 1980.11.16 und wir wollen, dass wieder auf die ursprüngliche Tabelle speichern, so dass wir verwenden, um eine UNPIVOT:

DECLARE @UnPivotSQL NVarChar(MAX)
SET @UnPivotSQL = 
    '
        SELECT
              TaskID
            , [Date]
            , [Hours]
        INTO 
            ##UnPivoted
        FROM
            ##Pivoted
        UNPIVOT
        (
            Value FOR [Date] IN (' + @FieldList + ')
        ) AS UP

    '

EXEC(@UnPivotSQL)

UPDATE
    Tasks
SET
    [Hours] = UP.[Hours]
FROM
    Tasks T
INNER JOIN
    ##UnPivoted UP
ON
    T.TaskID = UP.TaskID

Sie werden bemerken, dass ich Buggys Beispiel modifizierte Aggregation von Tag-of-Woche zu entfernen. Das liegt daran, es gibt keinen Weg zurück und aktualisiert, wenn Sie irgendeine Art von Aggregation durchzuführen. Wenn ich die Sonnenstunden Feld aktualisieren, wie kann ich wissen, welche am Sonntag Stunden ich zu aktualisieren? Dies funktioniert nur, wenn es keine Aggregation. Ich hoffe, das hilft!

Andere Tipps

PIVOTs immer eine Aggregatfunktion in der Pivot-Klausel erforderlich.

So gibt es immer Aggregation.

Also, nein, es kann nicht aktualisierbar sein.

Sie können einen INSTEAD OF TRIGGER auf einem auf der Aussage basiert Ansicht setzen und so können Sie jede Ansicht aktualisierbar machen.

Beispiel hier

das ist nur eine Vermutung, aber können Sie die Abfrage in eine Ansicht machen und dann aktualisieren?

Ich glaube nicht, dass es möglich ist, aber wenn Sie Einzelheiten über das eigentliche Problem schreiben, dass Sie jemand zu lösen sind versuchen, vielleicht in der Lage Ihnen einige Ratschläge auf einem anderen Ansatz zu geben, um es zu behandeln.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top