Domanda

C'è un modo per eseguire gli aggiornamenti su un tavolo imperniato in SQL Server 2008, dove i cambiamenti si propagano indietro alla tabella di origine, supponendo che non v'è alcuna aggregazione?

È stato utile?

Soluzione 2

Questo sarà solo realmente funzionare se le colonne imperniato formano un identificatore univoco. Quindi cerchiamo di prendere l'esempio di Buggy; qui è la tabella originale:

TaskID    Date    Hours

e vogliamo ruotare in una tabella che assomiglia a questo:

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

Al fine di creare il perno, si potrebbe fare qualcosa di simile:

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)

Allora avete il vostro tavolo orientabile in ##Pivoted. Ora si esegue un aggiornamento per uno dei campi ore:

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

Ora ##Pivoted ha una versione aggiornata delle ore per un compito che ha avuto luogo il 1980/11/16 e vogliamo salvare che tornare al tavolo originale, in modo da utilizzare un 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

Si noterà che ho modificato l'esempio di Buggy per rimuovere l'aggregazione di giorno della settimana. Ecco perché non c'è modo di tornare indietro e l'aggiornamento se si esegue qualsiasi tipo di aggregazione. Se aggiorno il campo SUNHours, come faccio a sapere che ore di domenica sto aggiornando? Questo funziona solo se non v'è alcuna aggregazione. Spero che questo aiuta!

Altri suggerimenti

PIVOTs richiedono sempre una funzione di aggregazione nella clausola perno.

In questo modo c'è sempre aggregazione.

Quindi, no, non può essere aggiornabile.

si può mettere un INSTEAD OF TRIGGER su una visione basata sulla dichiarazione, e quindi si può fare qualsiasi vista aggiornabile.

qui

questa è solo una supposizione, ma si può fare la query in una vista e poi aggiornarlo?

Non credo che sia possibile, ma se si posta specifiche sul problema effettivo che si sta cercando di risolvere qualcuno potrebbe essere in grado di darvi qualche consiglio su un diverso approccio alla gestione di esso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top