Fungsi SQL sebagai nilai parameter default?

105

Saya mencoba mengubah nilai parameter default dengan ini:

ALTER PROCEDURE [dbo].[my_sp]
@currentDate datetime = GETDATE()

dan semua yang diberikan pra-kompilator SQL kepada saya adalah kesalahan ini:

Psn 102, Level 15, Status 1, Prosedur my_sp, Baris 8 Sintaks salah dekat '('.

Saya sudah membuat prosedur. (Saya tidak yakin apakah itu relevan.) Saya menggunakan nilai default null dan memeriksanya nanti, tetapi tampaknya tidak tepat. Bisakah saya melakukan ini dalam satu baris?


Pembaruan: Saya keluar dari deskripsi MSDN tentang parameter prosedur tersimpan :

[= default] Adalah nilai default untuk parameter. Jika nilai default ditentukan, fungsi tersebut dapat dijalankan tanpa menentukan nilai untuk parameter itu.

Catatan:
Nilai parameter default dapat ditentukan untuk fungsi CLR kecuali untuk tipe data varchar (max) dan varbinary (max).

Ketika parameter fungsi memiliki nilai default, kata kunci DEFAULT harus ditentukan saat fungsi dipanggil untuk mengambil nilai default. Perilaku ini berbeda dengan menggunakan parameter dengan nilai default dalam prosedur tersimpan yang menghilangkan parameter juga menyiratkan nilai default.

Apakah saya salah membaca ini?

Terimakasih banyak.

pengguna58044
sumber

Jawaban:

160

Nilai default untuk parameter prosedur tersimpan harus berupa konstanta . Anda perlu melakukan hal berikut ...

ALTER Procedure [dbo].[my_sp]
@currentDate datetime = null
AS
IF @currentDate is null
SET @currentDate = getdate()
Brian Kim
sumber
36
atau SET @currentDate = COALESCE (@ currentDate, GETDATE ())
SQLMenace
Saya menggunakan itu sebelumnya. "Saya menggunakan nilai default nol dan memeriksanya nanti, tetapi tampaknya tidak tepat." Terima kasih Brian.
pengguna58044
Solusi ini sempurna.
R.Katnaan
35

Saya tidak berpikir itu mungkin, Anda harus menggunakan nilai literal (konstan) sebagai default.

Bagaimanapun Anda bisa melakukan ini:

Set @currentDate = Coalesce(@currentDate , GetDate())
Otávio Décio
sumber
13

Anda dapat mencoba sebagai berikut:

Set @CurrentDate=IsNull(@CurrentDate,GetDate())
R. Katnaan
sumber
8

Saya menyimpulkan Anda menggunakan Microsoft SQL Server dari tanda kurung siku dalam contoh Anda.

Dari MSDN :

Hanya nilai konstan, seperti string karakter; fungsi skalar (baik sistem, yang ditentukan pengguna, atau fungsi CLR); atau NULL dapat digunakan sebagai default.

Fungsi GETDATE()mengembalikan nilai yang berbeda dari waktu ke waktu, jadi ini bukan ekspresi konstan.

Bill Karwin
sumber
2

Nilai itu tidak deterministik dan tidak bisa digunakan

SQLMenace
sumber
0

Saran:

Setel default ke NULL

Lakukan Default GETDATE()di ujung depan.

MarlonRibunal
sumber