2013-03-20 88 views
9

我正在使用SQL Server。我想要它,所以如果@variable爲null,它被設置爲某個值。SQL Server:如果@variable爲空set @variable = x

set nocount on 

IF object_id('tempdb..##tmp') IS NOT NULL 
BEGIN 
    DROP TABLE ##tmp 
END 
CREATE TABLE ##tmp (week varchar (25), users int, stamps int) 

    declare @inter varchar(100) 
    declare @qt_users int 
    declare @qt_stamps int 
    declare @comando varchar(5000) 
    declare @start date = null 
    declare @end date = null 
    declare @week datetime = DATEADD(DAY, 6, @start) 

    --if @start is null, set it to a value: 

    if ([email protected]) 
    begin 
    set @start = '20130101' 
    end 
    if ([email protected]) 
    begin 
    set @end = GETDATE() 
    end 

    while @start < @end 
    begin 
    select @qt_users = COUNT(distinct id_user) 
     from stamps 
     where dt_synchronization between @start and @week 

    select @qt_stamps = COUNT(id_stamp) 
    from stamps 
    where dt_synchronization between @start and @week 

    set @inter = convert(varchar(10),@start,105) + ' até ' + 
    convert(varchar(10),@week,105) 

    set @comando = 'insert into ##tmp(week, users, stamps) values (''' + 
     @inter + ''','''+ 
     cast(@qt_users as varchar) + 
     ''',''' + cast(@qt_stamps as varchar) + ''')' 
    exec (@comando) 
    set @start = @week + 1 
    set @week = dateadd(day, 6, @start) 

    end 

select week, users, stamps from ##tmp 
+2

SQL Server?甲骨文? MySQL ... – JoDev 2013-03-20 17:12:16

回答

20

使用IS NULL來檢查代替,例如:

IF (@start IS NULL) 
    SET @start = '20130101' 

,或者在一個行:

SET @start = ISNULL(@start, '20130101') 

更新: 此外,你還爲時過早設置@week :

declare @week datetime = DATEADD(DAY, 6, @start) -- @start is NULL 

變化:

declare @week datetime 
-- IF checks here to set @start/@end if null... 
SET @week = DATEADD(DAY, 6, @start) 

在一個側面說明,也值得重構你的循環設置爲基礎的性能的方法。理論/數字表類型方法是研究的一個選項。

+0

我已經嘗試了兩個! – user2191922 2013-03-20 18:18:21

相關問題