0

私はデータベース(学校のプロジェクト)に取り組んでいます。そのデータベース (SQL Server 2008 R2) のテストが必要です。

私はその回復をテストしようとしています。PC がクラッシュするのに十分な時間がかかるように、ストアド プロシージャを作成しています。

問題は、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ループを削除すると、手順が機能します

4

5 に答える 5

1

最初のループの反復@@Rowcountは1になります。これは、新しいクエリウィンドウで自分でテストできます。

一般的に>=1であると仮定すると@i、ループは最初の反復で終了します。

于 2013-01-14T10:49:33.193 に答える
1

なぜあなたはしますか

WHILE(@i <= @@ROWCOUNT )

@@ROWCOUNT最後のステートメントの影響を受けた行数を返します。したがって、UPDATEその数をに入れてから@@ROWCOUNT、@iを増やします。あなたが達成しようとしていることは何ですか?UPDATE更新する行が。より少なくなるとすぐに@i+1WHILEループは終了します。

于 2013-01-14T10:50:16.033 に答える
0

私は他のすべての人に同意しますが、MAX句を何らかの方法で指示することをお勧めします。これにより、問題が解決する可能性があります。

影響を受けた最後のステートメント行を返す @@Rowcount の代わりに、明示的に指定して保持できるものを取得します。私は通常、変数を使用します。複雑なループでは、開始と終了の 3 つの変数と、述語用の変数が必要になる場合があることに注意してください。開始日などのステートメントから複雑なクエリを更新している場合があり、セットから増加する変数とは別に保持する必要がある場合があります。

以下は、私が使用するループ メソッドの簡単な例です。

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
于 2013-01-14T16:49:03.127 に答える