parameter opsional di proc disimpan SQL Server?

125

Saya sedang menulis beberapa procs yang tersimpan di SQL Server 2008, dan bertanya-tanya apakah konsep parameter input opsional dimungkinkan di sini?

Saya kira saya selalu bisa meneruskan NULL untuk parameter yang tidak ingin saya gunakan, periksa nilai di proc yang disimpan, kemudian ambil sesuatu dari sana, tetapi saya tertarik jika konsepnya tersedia di sini. Terima kasih!

larryq
sumber
2
Bacalah lama-lama di situs Erland, dia memiliki beberapa info bagus tentang kondisi pencarian dinamis: sommarskog.se/dyn-search.html
Aaron Bertrand

Jawaban:

201

Anda bisa mendeklarasikan seperti ini

CREATE PROCEDURE MyProcName
    @Parameter1 INT = 1,
    @Parameter2 VARCHAR (100) = 'StringValue',
    @Parameter3 VARCHAR (100) = NULL
AS

/* check for the NULL / default value (indicating nothing was passed */
if (@Parameter3 IS NULL)
BEGIN
    /* whatever code you desire for a missing parameter*/
    INSERT INTO ........
END

/* and use it in the query as so*/
SELECT *
FROM Table
WHERE Column = @Parameter
Raj Lebih
sumber
bagaimana jika parameternya adalah tipe uniqueidentifier? ex. @userId uniqueidentifier
RK Sharma
1
Menjawab @RKSharma untuk siapa saja yang bertanya-tanya juga - cara kerjanya sama dengan pengidentifikasi unik.
rinukkusu
55

Ya itu. Deklarasikan parameter sebagai:

@Sort varchar(50) = NULL

Sekarang Anda bahkan tidak perlu mengirimkan parameter masuk. Ini akan default ke NULL (atau apa pun yang Anda pilih untuk default).

Mike Cole
sumber
Anda bahkan tidak membutuhkan= NULL
OMG Ponies
3
Anda yakin tidak membutuhkannya?
Mike Cole
43
OMG Ponies, jika Anda tidak menyertakan = <NULL | beberapa nilai default>, maka parameter akan diperlukan. Anda dapat mengirimkannya sebagai NULL, tetapi kemudian Anda hanya menggeser logika itu ke aplikasi yang menggunakan prosedur tersebut.
Aaron Bertrand
10
Menambah poin Aaron. Lebih baik menggunakan "= NULL" jika Anda menambahkan parameter opsional baru ke proc yang sudah ada. Alasannya adalah, Anda mungkin tidak mengetahui SEMUA kode yang memanggil proc ini. Oleh karena itu, kecuali jika Anda menjadikannya opsional dengan menggunakan "= NULL", untuk semua tempat yang mungkin terlewatkan untuk diberikan nilainya, nilai tersebut akan rusak.
nanonerd
nanonerd: 2014 dan di atasnya setidaknya Anda dapat mengatur default dan itu akan mengambil itu dan BUKAN kesalahan ketika Anda tidak melewati parameter itu. Setidaknya begitulah cara saya bekerja pada tahun 2014 dengan
billpennock
0

2014 dan di atasnya setidaknya Anda dapat mengatur default dan itu akan mengambil itu dan BUKAN kesalahan ketika Anda tidak melewati parameter itu. Contoh Parsial: parameter ke-3 ditambahkan sebagai opsional. exec prosedur sebenarnya dengan hanya dua parameter pertama bekerja dengan baik

exec getlist 47,1,0

create procedure getlist
   @convId int,
   @SortOrder int,
   @contestantsOnly bit = 0
as
billpennock.dll
sumber