2013-03-22 104 views
0

我有insert語句(簡體)像下面TSQL中斷循環ROWCOUNT = 0

SET ROWCOUNT 100 

WHILE(1=1) 
BEGIN 

    INSERT INTO table1 
    SELECT * 
    FROM table2 
    WHERE some_condition 
    -- EDIT: Realized forgot to include this following vital line that is causing issue 
    SET @var = @var + @@ROWCOUNT  

    -- @@ROWCOUNT now takes on a value of 1, which will cause the following IF check to fail even when no lines are inserted 

    IF(@@ROWCOUNT = 0) 
    BEGIN 
    BREAK 
    END 

END 

一個存儲過程,但問題是,任何操作後,即使沒有更多的行適合我some_condition@@ROWCOUNT等於1,而不是0

當有0行返回匹配我的some_condition時,我該如何中斷該循環?

+0

當你說這是「簡化」時,你的實際代碼是否可以在INSERT和@@ ROWCOUNT的測試之間進行任何設置@@ ROWCOUNT值?在INSERT後立即捕獲int變量中的@@ ROWCOUNT值並在測試中使用該變量可能是最安全的。我不確定Sybase,但在SQL Server中,SET ROWCOUNT已被棄用,建議使用SELECT TOP(100)... – GilM 2013-03-22 22:24:09

+0

您發佈的代碼有一個BEGIN和兩個END,所以IF和BREAK都在外面你的WHILE循環。如何發佈有效的代碼? – 2013-03-23 02:14:43

回答

-6

實施類似於Moho的解決方案,但使用SELECT而不是SET來存儲@@ROWCOUNT

+1

'set @var = something'與'select @var = something'相同' – Moho 2013-03-29 17:01:18

+1

另外,我會很感激答案,因爲這是我的解決方案upvote;) – Moho 2013-03-29 17:02:09

+1

@Moho,也許是的,但我不得到相同的結果。 – czchlong 2013-04-01 20:25:08

0

另一種解決方案。這將檢查每個迭代以查看最後插入的記錄的ID是否已更改。如果沒有更改,則表示沒有記錄添加該迭代。

SET ROWCOUNT 100 
declare @id int; 
WHILE(1=1) 

    INSERT INTO table1 
    SELECT * 
    FROM table2 
    WHERE some_condition 

    IF(@id= @@identity) 
    BEGIN 
    BREAK 
    END 
    set @id = @@identity; 
END 
+0

我很抱歉,但我完全不明白。你有'SET @ID = @@ IDENTITY',但你檢查'@ID = @@ IDENTITY'?你能解釋一下嗎? – czchlong 2013-03-22 21:23:43

+0

更新回答 - – 2013-03-22 21:33:50

0

試試這個解決方案:

1解決方案

使用@@ROWCOUNT在循環的條件。

SET ROWCOUNT 100 

    INSERT INTO table1 
    SELECT * 
    FROM table2 
    WHERE some_condition 


WHILE(@@ROWCOUNT > 0) 
BEGIN 

    INSERT INTO table1 
    SELECT * 
    FROM table2 
    WHERE some_condition 

END 

第二孤子

使用goto

SET ROWCOUNT 100 

WHILE(1=1) 
BEGIN 

    INSERT INTO table1 
    SELECT * 
    FROM table2 
    WHERE some_condition 

    IF(@@ROWCOUNT = 0) 
    BEGIN 
    goto label 
    END 

END 

label1: 
print 'After lopp' 
+0

嗨Parado,我目前使用的是類似於你的第二種解決方案,但問題是@ @ ROWCOUNT'在刪除條件後不會是'0',它將會取值爲'1'。 – czchlong 2013-03-25 14:39:14

+0

@czchlong我在你的問題中看不到'delete'語句。 – Parado 2013-03-25 14:41:05

+0

對不起,我的意思是'insert'語句。 – czchlong 2013-03-25 14:48:32

0

我認爲你應該使用select得到@@rowcount到一個變量。試試這個:

declare @number_of_rows int  

SET ROWCOUNT 100 

WHILE(1=1) 
BEGIN 

    INSERT INTO table1 
    SELECT * 
    FROM table2 
    WHERE some_condition 

    SELECT @[email protected]@ROWCOUNT 

    IF (@number_of_rows = 0) 
    BEGIN 
    BREAK 
    END 
END 
+0

嗨Ofir謝謝你的回答。我剛剛意識到錯過了我的'insert'語句之後的一條重要線,我確信'@@ ROWCOUNT'設置爲'1'。 – czchlong 2013-03-25 16:30:42

7

「設置」語句創建爲1的行數,你應該做的是立即@@ ROWCOUNT保存到一個變量@RowCount,後來使用該變種。

declare @rowCount int 

WHILE(1=1) 
BEGIN 

    INSERT INTO table1 
    SELECT * 
    FROM table2 
    WHERE some_condition 
    -- EDIT: Realized forgot to include this following vital line that is causing issue 
    SET @rowCount = @@ROWCOUNT 
    SET @var = @var + @rowCount  

    -- @@ROWCOUNT now takes on a value of 1, which will cause the following IF check to fail even when no lines are inserted 

    IF(@rowCount = 0) 
    BEGIN 
    BREAK 
    END 

END 

另外,還可以通過最初設置@RowCount爲-1​​和改變WHILE條件@RowCount <> 0將不再需要該條件BREAK簡化。

+0

出於某種原因,如果我將@@ ROWCOUNT存儲到另一個變量中,那麼該變量將始終取值爲1.我認爲'SET'語句是責任。 – czchlong 2013-03-27 20:45:36

+0

在這個例子中,如果@rowCount是1,那麼一個記錄已經被插入到table1中。沒有辦法繞過它。 – Moho 2013-03-27 20:53:06