2013-03-20 15 views
9

私はSQL Serverを使用しています。 @variableがnullの場合は、値を設定します。SQL Server:@variableがNULLの場合@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

答えて

20

使用例えば、代わりにチェックしてNULL IS:

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

あるいは、1行に:

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