Sintaks salah dekat ')' memanggil prosedur yang tersimpan dengan GETDATE

121

Mungkin saya mengalami momen 'sore', tetapi adakah yang bisa menjelaskan mengapa saya mendapatkannya

Psn 102, Level 15, Status 1, Baris 2
Sintaks salah dekat ')'.

Saat berlari

CREATE PROC DisplayDate 
    (@DateVar DATETIME) 
AS 
BEGIN
    SELECT @DateVar
END
GO

EXEC DisplayDate GETDATE();
Nat
sumber

Jawaban:

170

Anda tidak bisa meneruskan panggilan fungsi sebagai argumen ke prosedur tersimpan Anda. Alih-alih gunakan variabel perantara:

DECLARE @tmp DATETIME
SET @tmp = GETDATE()

EXEC DisplayDate @tmp;
Mitch Wheat
sumber
22
Apakah ada alasan untuk pembatasan ini?
Zameer
@siswa Apakah ada alasan untuk batasan dasar seperti kurangnya tipe kolom boolean dan integer atau kurangnya kunci yang difilter di Oracle ...?
Skipper
20

Seperti yang disebutkan Mitch Wheat, Anda tidak bisa melewatkan suatu fungsi.

Jika dalam kasus Anda, Anda harus meneruskan nilai yang telah dihitung sebelumnya atau GETDATE () - Anda dapat menggunakan nilai default. Misalnya, ubah prosedur tersimpan Anda:

ALTER PROC DisplayDate 
(
    @DateVar DATETIME = NULL
) AS 
BEGIN
    set @DateVar=ISNULL(@DateVar,GETDATE())

    --the SP stuff here
    SELECT @DateVar
END
GO

Dan kemudian coba:

EXEC DisplayDate '2013-02-01 00:00:00.000'
EXEC DisplayDate

Catatan : Di sini saya menduga bahwa nilai NULL tidak digunakan untuk parameter ini. Jika ini bukan kasus Anda - Anda dapat menggunakan nilai lain yang tidak digunakan, misalnya '1900-01-01 00: 00: 00.000'

Alexander
sumber