2013-04-02 17 views
7

W TSQL, chciałbym zmienić poniższy kod, aby korzystać z zakodowanych dhomów do używania pętli do optymalizacji. Podana jest także moja nieudana próba dodania pętli.Jak używać pętli w 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

Potrzebujesz BEGIN i END pod swoim czasem –

Odpowiedz

13

Jesteś na dobrej drodze. Tęsknisz za swoim początkiem i końcem. Należy również podać wartość: @dhome. Wygląda na to zaczęło i to wypowiedziało się na trzeciej linii:

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 

Jeśli jesteś zaznajomiony z C/C#/C++, pomyśl o T-SQL na początek i koniec jak klamrami { i }, jeśli znasz lepiej VB Then i End If. Lub bardziej jak paskale Begin i End. Masz pomysł :)

+0

Czy w ten sam sposób zrobiłbym pętlę for w TSQL? – user1880670

+0

Nie ma czegoś takiego jak pętla 'FOR' w T-SQL. Kod w odpowiedzi zasadniczo symuluje funkcjonalność pętli 'FOR'. –

+0

Dzięki za pomoc Adam! – user1880670

1

Przykład 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 

Przykład 2

Podobnie inne podejście, jeśli są w porządku za pomocą tables.I temp osobiście przetestowane i nie spowoduje żadnych wyjątek (nawet jeśli tabela temp nie zawiera żadnych danych).

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 
Powiązane problemy