日期:2014-05-18  浏览次数:20424 次

为何在Procedure中if判断不起做用的?第一次用这个,还望各位仁兄赐教
我用sql server2005执行存储过程,并对@Dt发null值,本应if的关系,@time不会是null值,结果@time还是空值
小弟不足,甚是费解,所以望各位仁兄赐教赐教
SQL code

CREATE Procedure [dbo].[InsertBFData]
(
    @Dt datetime, 
    @Path nvarchar(256)
)
as
    Declare @time Datetime

    if     @Dt = null
    begin
        set @time = getdate()    
    end
        else
    begin
        set @time= @dt
    end
    insert into t_bf (bf_dt,bf_path) values (@time ,@Path)






------解决方案--------------------
SQL code

CREATE Procedure [dbo].[InsertBFData]
(
    @Dt datetime, 
    @Path nvarchar(256)
)
as
    Declare @time Datetime

    if  @Dt is null
    begin
        set @time = getdate()   
        insert into t_bf (bf_dt,bf_path) values (@time ,@Path) 
    end
        else
    begin
        set @time= @dt
        insert into t_bf (bf_dt,bf_path) values (@time ,@Path)
    end
    
go

--try

------解决方案--------------------
SQL code

CREATE Procedure [dbo].[InsertBFData]
(
    @Dt datetime, 
    @Path nvarchar(256)
)
as
    Declare @time Datetime

    if  @Dt is null
    begin
        set @time = getdate()   
        insert into t_bf (bf_dt,bf_path) values (@time ,@Path) 
    end
        else
    begin
        set @time= @dt
        insert into t_bf (bf_dt,bf_path) values (@time ,@Path)
    end
    
go

------解决方案--------------------
3个地方要注意:
1. 判断的时候不能用@Dt = null, 而要用 @Dt is null,其他都正确。
2. 你给入的变量@Dt的default没有定义,如果允许为null,可以定义成:@Dt datetime = null,这样可以变量给入的时候省去,减少信息的传输。
3. 关于优化,你的if then else 可以优化成:
set @time = ISNULL(@Dt, getdate())

最后存储过程精简为:
SQL code

CREATE Procedure [dbo].[InsertBFData]
(
    @Dt datetime = null, 
    @Path nvarchar(256)
)
as
    insert into t_bf 
    (
        bf_dt
        , bf_path
    )
    values 
    (
        ISNULL(@Dt, getdate())
        , @Path
    )