Saya menggunakan RAISERROR()
untuk menyediakan beberapa fungsionalitas Unit Testing dasar (seperti di sini ), tetapi saya frustrasi dengan ketidakmampuan untuk digunakan FLOATs
dalam pesan kesalahan. Saya tahu saya bisa melemparkan float ke string, tetapi saya menggunakan RAISERROR
dalam setiap unit test, saya tidak ingin menambahkan baris kode lain untuk setiap tes. (Tes unit saya sudah cukup bertele-tele!) Apakah ada cara untuk melakukan pemeran inline / konversi dalam RAISERROR
daftar parameter? Atau adakah cara lain untuk mengatasi kekurangan ini?
Pembaruan: Jadi pada akhirnya apa yang saya harap dapat saya lakukan adalah ini:
RAISERROR('Unit Test FAILED! %f', 11, 0, @floatParm)
Sayangnya, RAISERROR
tidak menangani% f atau mengapung secara umum. Jadi saya harus melakukan ini sebagai gantinya:
DECLARE @str VARCHAR(40) = CAST(@floatParm AS VARCHAR(40))
RAISERROR('Unit Test FAILED! %s', 11, 0, @str)
... yang hanya terlihat berantakan ketika itu tersebar melalui puluhan Tes Unit. Jadi saya ingin merebusnya menjadi seperti ini:
RAISERROR('Unit Test FAILED! %s', 11, 0, CAST(@floatParm AS VARCHAR(40))
Tapi itu memberiku Incorrect syntax near 'CAST'
pesan. Saya tidak mengerti mengapa itu ilegal, tetapi memang demikian. Apakah ada "satu liner" lain yang bisa saya gunakan di sini?
sumber
Jawaban:
Sayangnya, untuk alasan apa pun, Anda tidak dapat melakukan konversi inline dalam konteks itu, dan
RAISERROR
tidak langsung mendukungfloat
, lagi, untuk alasan apa pun.Untuk kelengkapan jawaban ini, berikut ini cuplikan yang relevan dari MSDN , yang saya yakin sudah Anda lihat (catatan: ini adalah teks yang sama di semua versi dokumentasi dari 2005 hingga 2012):
Satu-satunya solusi yang masuk akal yang dapat saya pikirkan adalah menulis prosedur tersimpan untuk menutup
RAISERROR
panggilan. Inilah titik awalnya:Sayangnya, tidak ada cara mudah untuk skala ini untuk sejumlah parameter sewenang-wenang ... Itu mungkin bisa dilakukan dengan menggunakan SQL dinamis bersarang berbelit-belit, yang akan menyenangkan untuk debug. Saya akan meninggalkan itu sebagai latihan untuk pembaca.
Saya menggunakan
sql_variant
asumsi bahwa karena alasan kode keseragaman, prosedur yang sama akan digunakan di mana-mana, bahkan untuk jenis nilai yang sedang didukung langsung olehRAISERROR
. Juga, ini dapat dibuat sebagai prosedur tersimpan sementara jika itu sesuai.Beginilah tampilan dari prosedur ini:
Keluaran:
Jadi hasil akhirnya adalah Anda tidak mendapatkan kemampuan format untuk float (roll sendiri), tetapi Anda memang mendapatkan kemampuan untuk menghasilkannya (desimal / numerik, juga!) Sambil tetap mempertahankan kemampuan format untuk tipe lainnya.
sumber
sql_variant
, jadi saya terjebak pada daftar argumen dan menganggap itu tidak mungkin. Anda telah mengajari saya sesuatu yang sangat berguna hari ini. Terima kasih banyak!