2010-06-19 37 views
9

Tôi muốn biết tại sao tôi không thể đặt giá trị mặc định cho tham số SP datetime để getdate() như sau:Tại sao chúng ta không thể đặt giá trị mặc định của tham số datetime trong stored procedure = getDate()?

Create PROCEDURE [dbo].[UPILog] 
(
    @UserID bigint, 
    @ActionID smallint, 
    @Details nvarchar(MAX) = null, 
    @Created datetime = getdate() 
) 

nếu tôi cố gắng tiết kiệm nó sẽ cho tôi một lỗi biên dịch

Msg 102, Level 15, State 1, Procedure UPILog, Line XX 
    Incorrect syntax near '('. 

EDIT: tôi biết rằng tôi có thể làm điều đó như dưới đây

Create PROCEDURE [dbo].[UPILog] 
(
    @UserID bigint, 
    @ActionID smallint, 
    @Details nvarchar(MAX) = null, 
    @Created datetime = null 
) 
AS 
if @Created is null 
    SET @Created=getdate() ... 

Trả lời

3

Bạn không thể sử dụng một cuộc gọi chức năng dưới dạng giá trị thông số mặc định.

Thật dễ dàng để giải quyết: đặt thông số gọi điện của bạn thành getdate() nếu không được đặt.

+0

lý do tại sao tôi không thể sử dụng nó .. sẽ không dễ dàng để động cơ sql làm? –

+0

Có giải thích tại sao nó không thể chấp nhận điều này .. hoặc nó giống như quy tắc SQL SERVER không thể gọi hàm là tham số mặc định –

+0

nó phải là một giá trị không đổi. –

1

trong điều kiện đơn giản nhất phải là một giá trị không đổi và GetDate() là một cuộc gọi hàm.

17

Nếu bạn muốn sử dụng @Created làm mặc định, sau đó đặt null làm giá trị thông số mặc định và đặt tham số @Created bằng getdate() nếu nó có null trong sp của bạn.

... 
    @CreateDate datetime = null 
) 
AS 
    if @CreateDate is null 
     set @CreateDate = getdate() 
... 
0

Bạn không thể sử dụng hàm làm giá trị tham số. Những gì tôi làm là tôi đặt tham số cho một số trong phạm vi ngày như '1900-01-01' và sau đó tôi kiểm tra nó trong proc. ví dụ:

CREATE PROC uspDataCompare 
    @CompareDate DATE = '1900-01-01' 
AS 

IF @CompareDate = '1900-01-01' SET @CompareDate = CONVERT(DATE, GETDATE()) 
Các vấn đề liên quan