2013-04-02 42 views
7

Trong TSQL, tôi muốn thay đổi mã sau đây từ phải sử dụng các tập tin được mã hóa cứng để sử dụng vòng lặp để tối ưu hóa. Nỗ lực thất bại của tôi khi cố thêm một vòng lặp cũng được bao gồm.Làm thế nào để sử dụng vòng lặp trong 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

Bạn cần một BEGIN và END trong thời gian của mình –

Trả lời

13

Bạn đang đi đúng hướng. Bạn đang thiếu bắt đầu và kết thúc của bạn. Ngoài ra, hãy đảm bảo cung cấp cho @dhome một giá trị. Dường như bạn bắt đầu và có nó nhận xét ra trên dòng thứ ba của bạn:

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 

Nếu bạn quen với C/C#/C++, suy nghĩ của T-SQL của Begin và End như dấu ngoặc nhọn {}, nếu bạn quen thuộc hơn với VB ThenEnd If. Hoặc giống như pascals BeginEnd. Bạn nhận được ý tưởng :)

+0

Nó có giống như cách tôi thực hiện vòng lặp for trong TSQL không? – user1880670

+0

Không thực sự là một thứ như một vòng lặp 'FOR' trong T-SQL. Mã trong câu trả lời về cơ bản mô phỏng các chức năng của một vòng lặp 'FOR', tuy nhiên. –

+0

Cảm ơn sự giúp đỡ của Adam! – user1880670

1

Ví dụ 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 

Ví dụ 2

Chỉ cần một cách tiếp cận nếu bạn cũng tốt sử dụng tables.I tạm thời đã đích thân thử nghiệm này và nó sẽ không gây ra bất kỳ ngoại lệ (ngay cả khi bảng tạm thời không có bất kỳ dữ liệu nào.)

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 
Các vấn đề liên quan