Saya mencoba menyiapkan kueri, sehingga akan membandingkan dua tanggal dari dua tabel yang berbeda, dan jika keduanya sama, maka kueri keluar. Jika tidak sama, maka kueri akan melanjutkan dan memasukkan beberapa hal. Saya tidak tahu bagaimana cara mendapatkannya untuk melakukan apa yang saya inginkan.
SELECT TOP(1) @dateA=a.someDate
FROM a
ORDER BY DESC;
SELECT TOP(1) @dateB=b.someDate
FROM b
ORDER BY DESC;
CASE WHEN @dateA=@dateB THEN raiseerror('dates equal',20,-1) with log;
Insert statements;
Bantuan apa pun akan sangat dihargai.
sql-server
t-sql
thejoker34
sumber
sumber
CASE
- SQL Server hanya memilikiCASE
ekspresi.Jawaban:
CASE
adalah ekspresi (bukan pernyataan) dan tidak dapat digunakan untuk kontrol aliran seperti itu - untuk tidak memanggil perintah, tidak mengembalikan lebih dari satu kolom / nilai, tidak dapat digunakan sebagai perintah sendiri.Menurut saya, Anda bisa menggunakan
IF
untuk meningkatkan kesalahan ketika tanggal sama, jika tidak, jalankan sisipan.Anda juga bisa melakukannya dengan cara lain. Jalankan sisipan hanya jika tanggal tidak sama , jika tidak, galat:
Jika Anda berpikir untuk menggunakan kesalahan hanya untuk tujuan keluar dari menjalankan sisipan, maka Anda hanya dapat menghapus segala sesuatu dari
ELSE
bawah, karena satu-satunya cara menyisipkan akan berjalan adalah ketika@dateA
dan@dateB
yang tidak sama :Saya telah mengurangi cara untuk menjadi jago tentang hal-hal seperti baris (vs "catatan"), dan kolom (vs "bidang"), tetapi keseluruhan ekspresi vs pernyataan adalah perbedaan yang sangat penting, untuk alasan inilah. Lihat " Rahasia Kotor Ekspresi KASUS ."
sumber
NULL
. Itu masih pengamatan yang baik bahwa dua versi yang disediakan Harun akan melakukan hal-hal yang berbeda dalam kasus itu.Gunakan
IF
bukanCASE
Ini tentu saja mengasumsikan bahwa Anda sebenarnya ingin meningkatkan kesalahan. Pilihan lainnya adalah:
Sekarang, perhatikan
BEGIN
danEND
. Itu akan menjadi penting. yangIF
pernyataan (danELSE
) hanya mempengaruhi perintah tepat di bawah ini. Jika Anda membutuhkan lebih dari satu perintah, Anda perlu BEGIN dan END .sumber
Jawaban lain menunjukkan bahwa KASUS adalah ekspresi , bukan pernyataan, dan dengan demikian tidak dapat dengan sendirinya mencakup pernyataan (seperti
RAISEERROR
atau yang lainnya). Jika kondisinya tidak banyak - terutama ketika itu hanya satu syarat, - pernyataan IF adalah pilihan yang sempurna untuk apa yang Anda coba lakukan, seperti juga telah disebutkan.Namun demikian, tergantung pada skenario Anda, ekspresi CASE masih dapat digunakan, hanya saja tidak persis seperti yang Anda tunjukkan. Secara khusus, jika ada banyak kondisi yang harus diperiksa di mana kecocokan harus menghasilkan serangkaian tindakan yang sama (misalnya menaikkan pengecualian dan mengakhiri skrip), Anda bisa menggunakan ekspresi KASUS dalam pernyataan penugasan yang menyimpan hasil KASUS, kemudian ikuti dengan JIKA memeriksa hasil yang disimpan dan melakukan tindakan yang diperlukan jika perlu, seperti ini:
Dalam hal ini tindakan yang diperlukan adalah meningkatkan pengecualian, tetapi pesan yang dikembalikan dengan pengecualian harus bergantung pada kondisi apa yang diperiksa terlebih dahulu. Pernyataan penugasan menggunakan ekspresi KASUS untuk memilih pesan mana yang akan disimpan dalam
@ErrorMessage
variabel.Anda juga dapat melihat bahwa kesalahan hanya dinaikkan secara bersyarat - hanya jika variabel tersebut benar-benar berisi pesan untuk ditampilkan. Jika nilainya string kosong atau nol, skrip akan terus berlanjut tanpa gangguan.
sumber
Apakah Anda memerlukan variabel?
sumber