Cú pháp không chính xác gần ')' gọi thủ tục được lưu trữ với GETDATE


121

Có lẽ tôi đang có một chút thời gian 'chiều', nhưng ai có thể giải thích tại sao tôi nhận được

Msg 102, Mức 15, Trạng thái 1, Dòng 2
Cú pháp không chính xác gần ')'.

Khi chạy

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

EXEC DisplayDate GETDATE();

Câu trả lời:


170

Bạn không thể chuyển một lệnh gọi hàm làm đối số cho thủ tục đã lưu trữ của mình. Thay vào đó, hãy sử dụng một biến trung gian:

DECLARE @tmp DATETIME
SET @tmp = GETDATE()

EXEC DisplayDate @tmp;

22
Có một lý do cho sự hạn chế này?
Zameer

@student Có lý do cho những hạn chế cơ bản như thiếu kiểu cột boolean và số nguyên hoặc thiếu các khóa được lọc trong Oracle ... không?
Skipper

20

Như Mitch Wheat đã đề cập, bạn không thể vượt qua một hàm.

Nếu trong trường hợp của bạn, bạn nên chuyển một giá trị được tính toán trước hoặc GETDATE () - bạn có thể sử dụng giá trị mặc định. Ví dụ: sửa đổi thủ tục đã lưu trữ của bạn:

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

    --the SP stuff here
    SELECT @DateVar
END
GO

Và sau đó thử:

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

Lưu ý : Ở đây tôi cho rằng giá trị NULL không được sử dụng cho tham số này. Nếu đó không phải là trường hợp của bạn - bạn có thể sử dụng một giá trị chưa sử dụng khác, ví dụ: '1900-01-01 00: 00: 00.000'

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.