Pergunta

Existe uma maneira para realizar atualizações sobre uma mesa girou em SQL Server 2008 onde as mudanças se propagam de volta para a tabela de origem, assumindo que não há agregação?

Foi útil?

Solução 2

Isto realmente só funciona se as colunas articuladas formar um identificador exclusivo. Portanto, vamos dar o exemplo de Buggy; aqui é a tabela original:

TaskID    Date    Hours

e queremos gire-a em uma tabela que se parece com isso:

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

A fim de criar o pivô, você faria algo assim:

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)

Então você tem sua mesa articulada em ##Pivoted. Agora que executa uma actualização para uma das horas campos:

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

Agora ##Pivoted tem uma versão actualizada das horas para uma tarefa que ocorreu em 1980/11/16 e queremos guardar isso de volta para a tabela original, por isso usamos um 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

Você notará que eu modifiquei o exemplo de Buggy à agregação de dia-de-semana. Isso é porque não há nenhuma parte traseira indo e atualização se você executar qualquer tipo de agregação. Se eu atualizar o campo SUNHours, como eu sei que horas de domingo Estou atualizando? Isto só irá funcionar se não houver nenhuma agregação. Espero que isso ajude!

Outras dicas

PIVOTs exigem sempre uma função de agregação na cláusula de pivô.

Assim, há sempre agregação.

Então, não, não pode ser atualizável.

você pode colocar um INSTEAD OF TRIGGER em uma visão com base na declaração e, assim, você pode fazer qualquer atualizável vista.

aqui

Este é apenas um palpite, mas você pode fazer a consulta em uma exibição e, em seguida, atualizá-lo?

Eu não acredito que é possível, mas se você postar detalhes sobre o problema real que você está tentando resolver alguém pode ser capaz de dar-lhe alguns conselhos sobre uma abordagem diferente para manuseá-lo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top