2013-04-02 19 views
7

In TSQL, vorrei modificare il seguente codice da utilizzare i dhomes con codifica rigida per utilizzare un ciclo per l'ottimizzazione. Il mio tentativo fallito di provare ad aggiungere un ciclo è anche incluso.Come si usano i loop in 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

Hai bisogno di un INIZIO e FINE sotto di te –

risposta

13

Sei sulla strada giusta. Ti stai perdendo il tuo inizio e fine. Inoltre, assicurati di fornire un valore a @dhome. Sembra che tu iniziato ad e lo hanno commentato sul vostro terza linea:

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 

Se si ha familiarità con C/C#/C++, pensare a T-SQL di iniziare e terminare come parentesi graffe { e }, se hai più familiarità con VB Then e End If. O più pascal Begin e End. Si ottiene l'idea :)

+0

Sarebbe la stessa cosa se avessi fatto un ciclo for in TSQL? – user1880670

+0

In realtà non esiste un ciclo 'FOR' in T-SQL. Il codice nella risposta simula fondamentalmente la funzionalità di un ciclo 'FOR', comunque. –

+0

Grazie per l'assistenza Adam! – user1880670

1

Esempio 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 

Esempio 2

Solo un altro approccio se si sta bene con tables.I temporanei hanno testato personalmente questo e non causerà alcun eccezione (anche se la tabella temporanea non ha dati.)

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 
Problemi correlati