SQL Server - neden pencere işlevlerini güncelleştirme deyimlerinde izin verilmiyor?


10

Aşağıdaki gibi bir güncelleme bildirimi çalıştırırken, bana şöyle bir hata mesajı alıyorum:

Pencereli işlevler yalnızca SELECT veya ORDER BY deyimlerinde görünebilir.

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

Bunun, aşağıdaki gibi güncellenebilir bir cte kullanarak kolayca çözülebileceğini biliyorum.

 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

Benim sorum, bir güncelleme deyiminde buna izin verilmemesi için herhangi bir neden var mı, bir çözüm olarak güncellenebilir bir cte kullanmaktan kaçınmalı mıyım?

Benim endişem pencere işlevlerini güncelleme deyimleri ile kullanırken sorunları olduğunu ve bu nedenle bu kabul edilebilir bir yöntem veya kaçınılması gerektiğini anlamak istiyorum.


1
Güncellenebilir CTE kabul edilebilir ve iyidir. GÜNCELLEME'de neden izin verilmediğine dair bir fikrim yok.
ypercubeᵀᴹ

2
Belki Hallowe'en bir tür koruma?
Aaron Bertrand

Yanıtlar:


5

UPDATE, SELECT veya ORDER BY ile uyumlu olmadığından UPDATE deyimlerinde pencere işlevlerine izin verilmez.

Pencere işlevleri, ilgili satırları yeniden inceleyen ve PARTITION BY ve ORDER BY gibi koşulları uygulayan kapsamlı SELECT ifadeleri gibidir. Buna ek olarak, birçok pencere işlevi ORDER BY deyimi gerektirir (örneğin ROW_NUMBER, LAG ve FIRST_VALUE).

UPDATE deyimleri SELECT yerine SET kullanır, bu nedenle aynı sorgu düzeyinde hiçbir yerde SELECT öğesine izin verilmez. UPDATE ile görünen tüm SELECT alt sorgularda bulunmalıdır.

ORDER BY öğesine izin verilmemesi, bir UPDATE ifadesi dikkate alındığında satırları güncelleme sırasına kayıtsızdır.

Bir CTE veya başka bir alt sorguyu, bir pencere işlevini kullanmak üzere bir GÜNCELLEME elde etmek için geçici bir çözüm olarak kullanmanın doğal bir dezavantajı yoktur. Bu, Itzik Ben-Gan gibi T-SQL uzmanlarının savunduğu ortak uygulamadır. ( Bu senaryoyu kapsadığı Microsoft SQL Server 2012 Yüksek Performanslı T-SQL Pencere İşlevlerini Kullanma adlı kitabının 29. sayfasına bakın .)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.