Pertanyaan Bagaimana cara membatasi NULL sebagai parameter ke prosedur tersimpan SQL Server?


Apakah mungkin untuk membuat prosedur yang tersimpan sebagai

CREATE PROCEDURE Dummy 
    @ID INT NOT NULL
AS
BEGIN
END

Kenapa tidak mungkin melakukan sesuatu seperti ini?


32
2017-12-01 08:54


asal


Jawaban:


Validasi parameter saat ini bukan merupakan fitur logika prosedural di SQL Server, dan NOT NULL hanya satu jenis validasi data yang mungkin. Datatype CHAR dalam tabel memiliki spesifikasi panjang. Apakah itu harus dilaksanakan juga? Dan bagaimana Anda menangani pengecualian? Ada metodologi yang ekstensif, sangat maju dan berbasis standar untuk penanganan pengecualian dalam skema tabel; tetapi tidak untuk logika prosedural, mungkin karena logika prosedural didefinisikan dari sistem relasional. Di sisi lain, prosedur yang tersimpan sudah memiliki mekanisme yang sudah ada untuk membesarkan kejadian kesalahan, terikat ke dalam banyak API dan bahasa. Tidak ada dukungan untuk batasan tipe data deklaratif pada parameter. Implikasi penambahan itu sangat luas; terutama karena didukung dengan baik, dan dapat diperluas, untuk menambahkan kode:

IF ISNULL(@param) THEN
    raise error ....
END IF

Konsep NULL dalam konteks prosedur yang tersimpan bahkan tidak terdefinisi dengan baik terutama dibandingkan dengan konteks tabel atau ekspresi SQL. Dan itu bukan definisi Microsoft. Kelompok-kelompok standar SQL telah menghabiskan banyak tahun menghasilkan banyak literatur membangun perilaku NULL dan batas-batas definisi untuk perilaku itu. Dan prosedur yang tersimpan bukan salah satunya.

Prosedur tersimpan dirancang agar seberat mungkin untuk membuat kinerja basis data seefisien mungkin. Tipe data parameter tidak ada untuk validasi, tetapi untuk memungkinkan kompilator memberikan informasi yang lebih baik kepada pengoptimal kueri untuk menyusun rencana permintaan terbaik yang mungkin. Batasan TIDAK NULL pada parameter mengarah ke bawah jalur nother keseluruhan dengan membuat kompilator lebih kompleks untuk tujuan baru memvalidasi argumen. Dan karenanya kurang efisien dan lebih berat.

Ada alasan mengapa prosedur yang tersimpan tidak ditulis sebagai fungsi C #.


-5
2017-12-01 09:07



Anda dapat memeriksa NULL-ness di sproc dan RAISERROR untuk melaporkan negara kembali ke lokasi panggilan.

CREATE   proc dbo.CheckForNull @i int 
as
begin
  if @i is null 
    raiserror('The value for @i should not be null', 15, 1) -- with log 

end
GO

Kemudian panggil:

exec dbo.CheckForNull @i = 1 

atau

exec dbo.CheckForNull @i = null 

39
2017-12-01 09:11



Kode Anda benar, masuk akal, dan bahkan praktik yang baik. Anda hanya perlu menunggu SQL Server 2014 yang mendukung sintaks semacam ini.

Lagi pula, mengapa menangkap saat runtime ketika Anda dapat pada waktu kompilasi?

Lihat juga dokumen msdn ini dan cari Natively Compiled di sana.

Seperti kata dkrez, nullabiliy tidak dianggap sebagai bagian dari definisi tipe data. Saya masih bertanya-tanya mengapa tidak.


12
2017-08-20 12:19