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 SET
kata kunci dan berarti 'penugasan', seperti dalam
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 benar-benar berbicara tentang operasi yang ditetapkan. Bahkan jika tim SQL Server menganggapnya sebagai operasi himpunan, apa tujuan dari 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 IDENTITY_INSERT
properti, yang membawa saya kembali ke pikiran pertama saya.
Adakah yang bisa menjelaskan masalah ini?
sumber
SET
selalu dalam topi penuh seperti kata kunciSELECT * FROM sys.messages WHERE text LIKE '%SET operation%'
memberikan 3 hasil lain yang semuanya sepertinya mengindikasikanSET
kata kunci juga.set operations
merujuk keUNION
danINTERSECT
danEXCEPT
, tetapi saya tidak bisa mendapatkan kesalahan untuk munculNULL
dalam situasi seperti itu. Saya pikir ini mungkin pesan kesalahan lama.Jawaban:
Saya hanya melihat melalui Spesifikasi SQL-92 dan melihat bagian yang mengingatkan saya pada pertanyaan ini.
Sebenarnya ada peringatan yang ditentukan untuk situasi ini seperti yang ditunjukkan di bawah ini
Saya berasumsi bahwa
SET
dalam Pesan Kesalahan SQL Server adalah referensi ke fungsi set pesan kesalahan itu meskipun saya tidak yakin mengapa itu akan membuat perbedaan antara agregat dan fungsi-fungsi himpunan lainnya, sejauh yang saya bisa lihat mereka identik. Bit tata bahasa yang relevan ada di bawah.sumber
Jawaban cepat
"SET lain * mungkin terkait dengan versi SQL Server yang lebih lama.
Saya biasa 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
defaultnyaON
.Ini berhubungan murni dengan apakah
Satu contoh:
memberi
Contoh lain:
Secara pribadi, saya mengabaikan peringatan itu dan membiarkan SET ANSI_WARNINGS ON 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
sumber
SET operation
bit tidak ditambahkan sampai tahun 2000.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:
sumber
MAX()
select max(foo) from (values (1), (2), (null)) as t(foo) where 1=2;
versusselect max(foo) over() from (values (1), (2), (null)) as t(foo) where 1=2;
MAX()
. Saya pikir Anda contoh kedua harus berbuat lebih banyak dengan urutan operasi menggunakan fungsi jendela.