it-swarm.asia

Arti 'SET' dalam pesan kesalahan 'Nilai kosong dihapus oleh agregat atau operasi SET lainnya'

Saya melihat pesan 'peringatan ANSI' di atas hari ini ketika menjalankan skrip kolega (dan saya tidak tahu yang mana dari banyak pernyataan yang menyebabkan peringatan ditampilkan).

Di masa lalu saya telah mengabaikannya: Saya menghindari nol dan jadi apa pun yang akan menghilangkannya adalah hal yang baik dalam buku saya! Namun, hari ini kata 'SET' secara harfiah meneriaki saya dan saya menyadari saya tidak tahu apa arti kata itu dalam konteks ini.

Pikiran pertama saya, berdasarkan fakta ini adalah huruf besar, adalah merujuk pada kata kunci SET dan berarti 'penugasan', seperti pada

UPDATE <table> SET ...

...ON DELETE SET NULL...

SET IDENTITY_INSERT <table> ON

Menurut Bantuan SQL Server, fitur 'peringatan ANSI' didasarkan pada ISO/ANSI SQL-92, spesifikasi yang hanya menggunakan satu kali penggunaan istilah 'Atur operasi' dalam judul subbagian, maka dalam kasus judul, dalam bagian penugasan data. Namun, setelah Googling cepat dari pesan kesalahan saya melihat contoh yang SELECT kueri dengan tampaknya tidak ada tugas yang terlibat.

Pikiran kedua saya, berdasarkan kata-kata peringatan SQL Server, adalah bahwa makna matematika dari himpunan tersirat. Namun, saya tidak berpikir bahwa agregasi dalam SQL adalah operasi set yang ketat. Bahkan jika tim SQL Server menganggapnya sebagai operasi himpunan, apa tujuan menempatkan kata 'himpunan' di ibukota?

Sementara Googling saya melihat pesan kesalahan SQL Server:

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

Kata-kata yang sama 'SET operasi' dalam kasus yang sama di sini hanya dapat merujuk pada penugasan properti IDENTITY_INSERT, yang membawa saya kembali ke pikiran pertama saya.

Adakah yang bisa menjelaskan masalah ini?

18
onedaywhen

Saya baru saja melihat Spesifikasi SQL-92 dan melihat sebuah bagian yang mengingatkan saya pada pertanyaan ini.

Sebenarnya ada peringatan yang ditentukan untuk situasi ini seperti yang ditunjukkan di bawah ini

b) Kalau tidak, biarkan TX menjadi tabel satu kolom yang merupakan hasil dari penerapan <value expression> ke setiap baris T dan menghilangkan nilai nol. Jika satu atau lebih nilai nol dihilangkan, maka kondisi penyelesaian dinaikkan: warning- nilai null dihilangkan dalam fungsi yang ditetapkan .

Saya berasumsi bahwa SET dalam SQL Server Error Message adalah referensi ke fungsi himpunan pesan kesalahan itu meskipun saya tidak yakin mengapa itu akan membuat perbedaan antara agregat dan fungsi himpunan lainnya, sejauh yang saya dapat melihat mereka sama. Bit tata bahasa yang relevan ada di bawah.

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
13
Martin Smith

Jawaban cepat

"SET lain * mungkin terkait dengan versi SQL Server yang lebih lama.

Saya terbiasa melihatnya lebih kembali ketika saya bekerja dengan SQL Server 6.5 dan 7 saya yakin, tapi sudah lama. Banyak quirks telah diatasi + SQL Server mengikuti standar lebih banyak

Lebih lama:

Saat ini, pesan dikendalikan oleh SET ANSI_WARNINGS yang secara default adalah ON.
Ini murni berkaitan dengan apakah

  • peringatan dihasilkan oleh nilai NULL dalam agregat.
  • silent truncation terjadi pada saat insert/update untuk bidang tipe varchar

Satu contoh:

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;

memberi

(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)

Contoh lain:

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

Secara pribadi, saya mengabaikan peringatan dan membiarkan SET ANSI_WARNINGS AKTIF karena konsekuensi lain untuk kolom yang dihitung dan tampilan indeks pengaturannya OFF.

Akhirnya, mungkin ada pemicu atau kolom yang dihitung atau tampilan yang diindeks menghasilkan peringatan ini di suatu tempat

9
gbn

Sisi lain dari peringatan mengacu pada operasi 'set' bukan operasi 'SET' - yang terlihat seperti bug pesan bagi saya - misalnya, ia juga diproduksi dengan fungsi windowing:

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.
*/