2013-04-02 12 views
7

TSQLでは、ハードコードされたdhomesを使用して最適化のためにループを使用する必要がないため、次のコードを変更したいと考えています。ループを追加しようとして失敗しました。TSQLでどのようにループを使用しますか?

Declare @dhome Tinyint, @bp smallint, @lr smallint, @q smallint 

    // Set @dhome = 1 
    While(@dhome <= 3) // My attempt to add a loop 

    SELECT @lr = MAX(NQdDate), @q = NQd 
    FROM NQdHistory 
    WHERE dhomeId = @dhome 
    GROUP BY NQdDate, NQd 

    SELECT @bd = COUNT(*) 
    FROM bdhome 
    WHERE NQdDate= @lr AND dhomeID= @dhome 

    DELETE FROM ND1 WITH(XLOCK) 
    WHERE dhomeID= @dhome AND NQdDate= @lr 

    UPDATE NQdHistory 
    SET Nbd = @q - @@RowCount - @bp, NBd = @bp 
    WHERE NQdDate= @lr AND dhomeID= @dhome 

    Set @dhome = @dhome +1 //My attempt to end a loop 
+2

あなたはBEGINとENDを必要としています –

答えて

13

あなたは正しい軌道に乗っています。あなたはあなたの始まりと終わりを欠いています。また、@dhomeに値を設定してください。あなたが開始し、それはあなたの3行目のコメントアウト持っているように見えます:

Declare @dhome Tinyint, @bp smallint, @lr smallint, @q smallint 

    // Set @dhome = 1 
While(@dhome <= 3) // My attempt to add a loop 
begin 
    SELECT @lr = MAX(NQdDate), @q = NQd 
    FROM NQdHistory 
    WHERE dhomeId = @dhome 
    GROUP BY NQdDate, NQd 

    SELECT @bd = COUNT(*) 
    FROM bdhome 
    WHERE NQdDate= @lr AND dhomeID= @dhome 

    DELETE FROM ND1 WITH(XLOCK) 
    WHERE dhomeID= @dhome AND NQdDate= @lr 

    UPDATE NQdHistory 
    SET Nbd = @q - @@RowCount - @bp, NBd = @bp 
    WHERE NQdDate= @lr AND dhomeID= @dhome 

    Set @dhome = @dhome +1 //My attempt to end a loop 
end 

あなたがC/C#/ C++に精通している場合、T-SQLのを考え始め、中括弧{}のように終了、 VB ThenEnd Ifに詳しい方はこちらをご覧ください。またはパスカルのようなものBeginEnd。あなたは考えを得る:)

+0

TSQLでforループを実行した場合と同じ方法でしょうか? – user1880670

+0

T-SQLには 'FOR'ループのようなものはありません。答えのコードは基本的に 'FOR'ループの機能をシミュレートします。 –

+0

アダムの助けをありがとう! – user1880670

1

例1

DECLARE @I INT,@COUNTVAR INT 
SET @I = 1 
DECLARE @Parent_Child TABLE(ID INT IDENTITY(1,1),ParentPositionID INT NULL,ChildPositionId Int) 

INSERT INTO @Parent_Child(ParentPositionID,ChildPositionId) 
SELECT DISTINCT PARENT_POSITION_ID,CHILD_POSITION_ID from tblPOSITION_HIERARCHY 
--WHERE CHILD_POSITION_ID IN (--YOUR CONDITION IF ANY) 
SELECT @COUNTVAR =COUNT(*) FROM @PTS_Parent_Child 
DECLARE @int_SUPE_POSITION_ID INT, @int_CHILD_POSITION_ID INT 
--loop through records here 
WHILE @I <= @COUNTVAR 
BEGIN 
SELECT @int_SUPE_POSITION_ID=ParentPositionID,@int_CHILD_POSITION_ID=ChildPositionId FROM @Parent_Child WHERE [email protected] 
--Whatever you want to do with records 
SET @[email protected]+1 
END 

例2

ちょうど別のアプローチあなたは一時tables.Iを用いて微細であれば、個人的にこれをテストして、それがいずれかを引き起こすことはありません例外(テンポラリテーブルにデータがない場合でも)

CREATE TABLE #TempTable 
    (
     ROWID int identity(1,1) primary key, 
     HIERARCHY_ID_TO_UPDATE int, 
    ) 
    --INSERT DATA INTO TEMP TABLE USING INSERT INTO CLAUSE OR FOR EAXMPLE BELOW 
    --INSERT INTO #TempTable VALUES(1) 
    --INSERT INTO #TempTable VALUES(2) 
    --INSERT INTO #TempTable VALUES(4) 
    --INSERT INTO #TempTable VALUES(6) 
    --INSERT INTO ##TempTable VALUES(8) 


    DECLARE @MAXID INT 
    SET @COUNTER =1 
    SELECT @MAXID=COUNT(*) FROM #TempTable 
    --PRINT @MAXID 
    WHILE (@MAXID > 0) 
    BEGIN 
     --DO THE PROCESSING HERE 
     SELECT @HIERARCHY_ID_TO_UPDATE =PT.HIERARCHY_ID_TO_UPDATE FROM  #TempTable PT WHERE [email protected] 
     --PRINT '@MAXID VALUE ' 
     --PRINT @MAXID 
     SET @[email protected] 
     SET @COUNTER [email protected] + 1 
    End 


    If(OBJECT_ID('tempdb..#TempTable') IS NOT NULL) 
    BEGIN 
     DROP TABLE #TempTable 
    END 
関連する問題