2013-01-14 34 views
0

我正在研究数据库(学校项目)。我需要对该数据库进行一些测试(SQL Server 2008 R2)。虽然在存储过程循环不起作用

我试图测试它的恢复。因为我正在构建一个存储过程,所以需要足够长的时间才能使我的电脑崩溃。

问题是,我使用doenst while循环似乎工作。

存储过程:

USE [OnderzoekSQL] 
GO 

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[Test_pro_opnemen] 
-- Add the parameters for the stored procedure here 
@bnummer int OUT, 
@i int 

AS 
BEGIN 

SET NOCOUNT ON; 
WHILE(@i <= @@ROWCOUNT) 
    -- Insert statements for procedure here 
    SELECT TOP 1 @bnummer = accountnumber 
    FROM dbo.bank 
    ORDER BY saldo DESC 

    PRINT @bnummer 

    UPDATE bank 
    SET saldo = '0' 
    WHERE accountnumber = @bnummer 
    SET @i = @i+1 

END 

而且表:

CREATE TABLE [dbo].[bank](
[accountnumber] [nvarchar](50) NOT NULL, 
[saldo] [real] NULL, 
[owner_id] [int] NULL; 

约在为nvarchar和ACCOUNTNUMBER的INT之间的差异。它并不重要,因为我只在accountnumber中使用数字。

程序的工作,如果我删除While循环

+0

怎么样在第一回路校验@i参数?如果您发送@ i = NULL,那么首先检查您的条件是否为真。如果@i> 0,则会发生同样的情况。 – valex

回答

1

你为什么这样做

WHILE(@i <= @@ROWCOUNT) 

@@ROWCOUNT返回受上一条语句影响的行数。所以你的UPDATE把这个数字放入@@ROWCOUNT,然后你增加@i。你试图达到什么目标?只要您的UPDATE更新的行少于@i+1,您的WHILE循环就会终止。

+0

这也是一个问题。它永远不会停止..... –

+0

它可以运行数小时 –

+0

它永远不会停止?这意味着UPDATE影响的行数很大......只要@i达到那个数字,WHILE循环至少应该停止。你有多少行可以满足UPDATE条件? –

1

在第一循环迭代@@Rowcount将是1 - 你可以在一个新的查询窗口中测试这个自己。

假设@i通常> = 1,循环将在其第一次迭代时退出。

0

我同意其他人,但我会建议你以某种方式决定你的MAX条款,这可能会解决这个问题:

而是行数返回受影响的行的最后陈述@@,得到的东西,你可以明确地状态和保持。我通常使用一个变量。 BE AWARE将会出现复杂循环的时候,您可能需要三个变量来开始一个结束,并且需要一个谓词变量。有时候我发现你可能会更新一个复杂的查询语句,比如开始日期,而且你需要保持与一个集合中增加的变量分离。

这是一个循环法的一个简单的例子,我会用:

declare @Table Table (personID int identity, person varchar(8)); 

insert into @Table values ('Brett'),('John'),('Peter'); 

-- say I want to affect a whole table. I need to get it's count and HOLD it. You could just select an expression but a variable is more clean IMHO. 
declare @Max int; 

-- I should set a beginning variable and statically set it, however if you are doing an update in the middle of something you can set it with 
-- a select expression as well. 
declare @Current int = 1; 

-- bind the variable to the count of a table I want to update. My example is simple, it could work with a table that is very large as well though. 
select @Max = count(*) from @Table 

-- see data before loop 
select * From @Table; 

while @Current <= @Max -- @Current is explicitly set and so is Max. However @Current will increment in the BEGIN END BLOCK. 
BEGIN 
    update @Table set person = person + 'New' where personID = @Current -- update from @Current variable 

    set @Current += 1; -- increment up one in the loop AFTER OPERATION 
END 

-- see data after the loop 
select * 
from @Table 
0

这可能是旧的,但在原始WHILE语句你只执行的第一行代码WHILE语句之后。你必须在循环中有一个BEGIN和END。

你的循环应该是这个样子:

WHILE(@i <= @@ROWCOUNT) 

    BEGIN 

    -- Insert statements for procedure here 
     SELECT TOP 1 @bnummer = accountnumber 
     FROM dbo.bank 
     ORDER BY saldo DESC 

     PRINT @bnummer 

     UPDATE bank 
     SET saldo = '0' 
     WHERE accountnumber = @bnummer 
     SET @i = @i+1 

    END 
0

尝试此While循环....

SET NOCOUNT ON 
DECLARE @LoopCounter INT , @MaxEmployeeId INT, 
    @EmployeeName NVARCHAR(100) 

SELECT @LoopCounter = min(id) , @MaxEmployeeId = max(Id) FROM #Employee 

WHILE (@LoopCounter IS NOT NULL AND @LoopCounter <= @MaxEmployeeId) 

BEGIN 
UPDATE TOP(1) #Employee 
SET Status = 1, @EmployeeName = Name WHERE Id = @LoopCounter AND Status = 0 

PRINT @EmployeeName

SELECT @LoopCounter = min(id) FROM #Employee WHERE Id >= @LoopCounter AND Status = 0 
END