2013-04-02 3 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. Похоже, что вы начали и он заметил на вашей третьей строке:

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 Then и End If. Или больше похоже на pascals Begin и End. Вы получаете идею :)

+0

Было бы так же, если бы я сделал цикл for в TSQL? – user1880670

+0

В T-SQL нет такой вещи, как цикл FOR 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 ROWID=[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 
Смежные вопросы