'Null değeri bir toplama veya başka bir SET işlemi ile ortadan kaldırıldı' hata mesajındaki 'SET' anlamına gelir.


18

Bir meslektaşınızın senaryosunu çalıştırırken bugün yukarıdaki 'ANSI uyarısı' mesajını gördüm (ve birçok ifadeden hangisinin uyarının gösterilmesine neden olduğunu bilmiyorum).

Geçmişte görmezden geldim: Kendimi boş bırakmıyorum ve bu yüzden onları ortadan kaldıracak her şey kitabımda iyi bir şey! Ancak bugün 'SET' kelimesi tam anlamıyla bana bağırdı ve kelimenin anlamının bu bağlamda ne olması gerektiğini bilmediğimi fark ettim.

İlk düşüncem, büyük harf olduğu gerçeğine dayanarak, SETanahtar kelimeye atıfta bulunması ve "atama" anlamına gelmesidir.

UPDATE <table> SET ...

...ON DELETE SET NULL...

SET IDENTITY_INSERT <table> ON

SQL Server Yardımı'na göre, 'ANSI uyarıları' özelliği ISO / ANSI SQL-92'yi temel alır; bu özellik, bir alt başlıktaki 'Set operasyonu' terimini, dolayısıyla başlık durumunda, veri atama bölümü. Ancak, hata iletisinin hızlı bir Googlinginden sonra SELECT, görünüşte hiçbir ödev içermeyen sorgular olan örnekler görüyorum .

SQL Server uyarısının ifadesine dayanan ikinci düşüncem, kümenin matematiksel anlamının ima edildiği idi. Ancak, SQL'de toplama kesinlikle ayarlanmış bir işlem konuştuğunu sanmıyorum. SQL Server ekibi bunun ayarlanmış bir işlem olduğunu düşünse bile, 'set' kelimesini büyük harflere koymanın amacı nedir?

Googling yaparken bir SQL Server hata mesajı fark ettim:

Table 'T' does not have the identity property. Cannot perform SET operation.

Burada aynı durumda 'SET operasyonu' aynı sözcükler sadece IDENTITY_INSERTmülkün atanmasına atıfta bulunabilir , bu da beni ilk düşünceme geri getirir.

Meseleye kimse ışık tutabilir mi?


Her zaman bir dizi satırda işlem anlamına geldiğini varsaydım.
Martin Smith

@MartinSmith Ben öyle düşünmüyorum o zamandan beri SETher zaman bir anahtar kelime gibi tam büyük harf
JNK

@JNK - Evet bu düşünce üzerinde bu açıklamayı artırabilir başka bir toplu olmayan operasyon olması gerektiğini varsayalım, bu yüzden ne olduğunu açıklamak olabilir sanırım!
Martin Smith

SELECT * FROM sys.messages WHERE text LIKE '%SET operation%'SETanahtar kelime de gösteren diğer 3 sonuç verir .
Martin Smith

Biraz daha arama yaptım ve aslında matematiksel setlerde olduğu gibi set işlemlerine atıfta bulunabilir. SS 2k dokümanlarında set operationsatıfta bulunmak için çok sayıda referans buldum UNIONve INTERSECTve bu koşulların hiçbirinde EXCEPTortaya çıkan hatayı alamıyorum NULL. Eski bir hata mesajı olabileceğini düşünüyorum.
JNK

Yanıtlar:


13

Sadece SQL-92 Spesifikasyonu'na bakıyordum ve bana bu soruyu hatırlatan bir pasaj gördüm.

Aslında bu durum için aşağıda belirtildiği gibi önceden belirlenmiş bir uyarı var

b) Aksi takdirde, TX'in <value expression>her T sırasına uygulanmasının ve null değerlerin kaldırılmasının sonucu olan tek sütunlu tablo olmasına izin verin . Bir veya daha fazla boş değer elimine edilirse, bir tamamlama koşulu ortaya çıkar: ayar fonksiyonunda uyarı- boş değer elenir .

Ben SETSQL Server Hata İletisi, eşanlamlı olarak görebildiğim kadarıyla neden kümeler ve diğer set işlevleri arasında bir ayrım yapmak emin değilim, ancak bu hata iletisinin set işlevine bir başvuru olduğunu varsayalım . İlgili gramer biti aşağıdadır.

6.5  <set function specification>

         Function

         Specify a value derived by the application of a function to an
         argument.

         Format

         <set function specification> ::=
                COUNT <left paren> <asterisk> <right paren>
              | <general set function>

         <general set function> ::=
                <set function type>
                    <left paren> [ <set quantifier> ] <value expression> <right paren>


         <set function type> ::=
              AVG | MAX | MIN | SUM | COUNT

         <set quantifier> ::= DISTINCT | ALL

9

Hızlı cevap

"Diğer SET * büyük olasılıkla eski SQL Server sürümleriyle ilgilidir.

SQL Server 6.5 ve 7 ile çalıştığımda daha çok görüyordum Eminim, ama biraz zaman oldu. Birçok tuhaflık giderildi + SQL Server standartları daha fazla takip ediyor

Uzun:

Günümüzde, mesaj SET ANSI_WARNINGSvarsayılan olarak hangi tarafından kontrol edilir ON.
Bu tamamen

  • toplamdaki bir NULL değeriyle uyarı oluşturulur.
  • varchar tipi alanlar için ekleme / güncelleme işleminde sessiz kesme

Bir örnek:

DECLARE @foo TABLE (bar int NULL);
INSERT @foo VALUES (1), (2), (NULL);

SET ANSI_WARNINGS ON;
SELECT SUM(bar) FROM @foo;
SET ANSI_WARNINGS OFF;

SELECT SUM(bar) FROM @foo;

verir

(3 row(s) affected)
---- -----------
ON   3
Warning: Null value is eliminated by an aggregate or other SET operation.
(1 row(s) affected)
---- -----------
OFF  3
(1 row(s) affected)

Başka bir örnek:

DECLARE @foo TABLE (bar varchar(5) NULL);
SET ANSI_WARNINGS ON;
INSERT @foo VALUES ('123456'); -- error
GO
DECLARE @foo TABLE (bar varchar(5) NULL);
SET ANSI_WARNINGS OFF;
INSERT @foo VALUES ('123456'); -- OK
GO

Şahsen, uyarıyı yok sayıyorum ve hesaplanan sütunların diğer sonuçları ve KAPALI ayarının dizinlenmiş görünümleri nedeniyle SET ANSI_WARNINGS AÇIK bırakıyorum.

Son olarak, bu uyarıyı bir yerde üreten bir tetikleyici veya hesaplanmış sütun veya dizine alınmış görünüm olabilir


Hata iletisinin ifadesi kesinlikle NULL'ları da ortadan kaldırabilecek bir toplu olmayan işlem olduğunu (veya olduğunu) ima eder.
Martin Smith

@ Martin Smith: katılıyorum. Son ifademe göre dolaylı da olabilir. Veya planda görülebilecek bazı optimizasyon stratejileri
gbn

Utanç, SQL Server 7.0'dan daha eski bir şey için belgelerin herhangi bir yerde çevrimiçi görünmüyor.
Martin Smith

1
örnek (bu eski şeyleri bulmak zor): kbalertz.com/Feedback.aspx?kbNumber=149921/EN-US
gbn

1
Aslında iletinin SQL Server 7.0 sürümü sadece gibi görünüyor olsa da Uyarı: Null değeri toplama kaldırıldı. . SET operationBit 2000 yılına kadar eklenmedi
Martin Smith

2

Uyarının diğer tarafı, bana bir mesaj hatası gibi görünen 'SET' işlemleri 'set' işlemlerini ifade eder - örneğin, pencereleme işlevleriyle de üretilir:

select max(foo) over() as max_foo from (values (1), (2), (null)) as t(foo);
/*
max_foo
-------
2
2
2

Warning: Null value is eliminated by an aggregate or other SET operation.
*/

1
Yine de toplama kısmına atıfta bulunuyor gibi görünüyorMAX()
JNK

Buna 'toplama bölümü' denir mi? Ben tabii demek istediğini biliyorum, ama onlar farklı operasyonlardır - örneğin karşılaştırmak select max(foo) from (values (1), (2), (null)) as t(foo) where 1=2;karşıselect max(foo) over() from (values (1), (2), (null)) as t(foo) where 1=2;
Jack Douglas

2
Bu toplama işlevi :) Hatanın atıfta bulunduğuna inanıyorum MAX(). Sanırım ikinci örnek, pencere işlevlerini kullanarak işlem sırası ile daha fazlasını yapmak zorunda.
JNK

tamam - SS belgelerinden ne demek istediğini gör
Jack Douglas
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.