SQL Server - por que as funções de janela não são permitidas nas instruções de atualização?

10

Ao executar uma instrução de atualização, como a abaixo, recebo um erro dizendo que

As funções com janelas podem aparecer apenas nas cláusulas SELECT ou ORDER BY.

UPDATE dbo.Dim_Chart_of_Account
SET Account_Order = LAG([Account_Order]) OVER (ORDER BY [Account_SKey])

Eu sei que isso pode ser facilmente contornado usando um cte atualizável, como abaixo

 WITH my_cte AS (
     SELECT [Account_Order], LAG([Account_Order]) OVER (ORDER BY [Account_SKey]) AS acc_order_lag
     FROM Dim_Chart_of_Account
)
UPDATE my_cte
SET [Account_Order] = acc_order_lag

Minha pergunta é: existem razões para isso não ser permitido em uma declaração de atualização? Devo evitar o uso de um cte atualizável como solução alternativa?

Minha preocupação é que haja problemas ao usar funções da janela com instruções de atualização e, portanto, gostaria de entender se esse é um método aceitável ou se deve ser evitado.

Neil P
fonte
11
O CTE atualizável é aceitável e bom. Não faço ideia por que isso não é permitido na ATUALIZAÇÃO.
precisa saber é o seguinte
2
Talvez Hallowe'en proteção de algum tipo?
Aaron Bertrand

Respostas:

5

As funções de janela não são permitidas nas instruções UPDATE porque UPDATE não é compatível com SELECT ou ORDER BY.

As funções da janela são como instruções SELECT no escopo que reexaminam as linhas relevantes e aplicam condições como PARTITION BY e ORDER BY. Além disso, muitas funções da janela requerem uma cláusula ORDER BY (ROW_NUMBER, LAG e FIRST_VALUE, por exemplo).

As instruções UPDATE usam SET em vez de SELECT, portanto, SELECT não é permitido em nenhum lugar do mesmo nível de consulta. Qualquer SELECT que apareça com UPDATE deve estar contido em uma subconsulta.

Desabilitar ORDER BY faz sentido, considerando que uma instrução UPDATE é indiferente à ordem em que atualiza as linhas.

Não há desvantagem inerente ao uso de um CTE ou outra subconsulta como solução alternativa para obter um UPDATE para usar uma função de janela. Essa é a prática comum defendida por especialistas em T-SQL como Itzik Ben-Gan. (Consulte a página 29 de seu livro, T-SQL de alto desempenho do Microsoft SQL Server 2012 usando funções de janela, onde ele cobre esse cenário exato.)

Doug Lane
fonte