Aggiornamenti su perni in SQL Server 2008
-
05-09-2019 - |
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?
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
PIVOT
s 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.
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.