1

テーブルに 3 つの連続した本を追加するストアド プロシージャを実行しようとしています...

これが私のクエリです...

ALTER PROCEDURE dbo.AddCards @cnt int   
AS 
BEGIN    
   while(@cnt < 810010010513) 
   begin 
      insert into prepaidbooks(sbarcode, sdescription, lServiceId, iQty, dblWashValue, dblBookPrice, lLocationId, lBookTypeId)  
      values(@cnt, 'Dealer Car Wash', 43, 1, 9, 0, 1, 7)  

      set @cnt = @cnt + 1  
    END 
END

@CNT正しく動作していません...値ボックスで定義するように求めるボックスが表示されます。それを 810010010511 に変更すると、

変換できません

そのままにしておくと、次のようになります。

プロシージャまたは関数 'AddCards' には、指定されていないパラメーター '@cnt' が必要です。

影響を受ける行はありません。
(0 行が返されました) @RETURN_VALUE = [dbo].[AddCards] の実行が終了しました。

助けてください。

ありがとう

4

2 に答える 2

4

810010010511大きすぎint-使用するかBIGINT、使用する数を少なくします(int最大2147483648

ALTER PROCEDURE dbo.AddCards
      @cnt BIGINT
AS 
BEGIN    
   WHILE (@cnt < 810010010513) 
   BEGIN 
      INSERT INTO dbo.prepaidbooks(sbarcode, sdescription, lServiceId, iQty, dblWashValue, dblBookPrice, lLocationId, lBookTypeId)  
      VALUES (@cnt, 'Dealer Car Wash', 43, 1, 9, 0, 1, 7)  

      SET @cnt = @cnt + 1  
    END 
END

これで、次のように実行できるようになります。

EXECUTE dbo.AddCards @cnt = 810010010511 

テーブルの値を取得します。

WHILE (@cnt < 810010010513)補足として、ストアドプロシージャにこのような値を「ハードコーディング」することは、非常に悪い考えです。そのストアドプロシージャを他の場合に再利用することはできません。少なくとも@cnt、ストアドプロシージャの2番目のパラメータとして「上限」を渡す必要があります。次のようになります。

ALTER PROCEDURE dbo.AddCards
      @cnt BIGINT, @max BIGINT
AS 
BEGIN    
   WHILE (@cnt < @max) 
   BEGIN 
      INSERT INTO dbo.prepaidbooks(sbarcode, sdescription, lServiceId, iQty, dblWashValue, dblBookPrice, lLocationId, lBookTypeId)  
      VALUES (@cnt, 'Dealer Car Wash', 43, 1, 9, 0, 1, 7)  

      SET @cnt = @cnt + 1  
    END 
END

次に、次のようなストアドプロシージャを実行します。

EXECUTE dbo.AddCards @cnt = 810010010511, @max = 810010010513
于 2012-06-12T20:37:35.537 に答える
0

ループの代わりに別の提案があります。さらに必要な場合は、クロス結合を追加して、約 2000 の連続書籍を処理できます。@marc_s から更新された署名を借用します (そして、2 冊ではなく 3 冊の本が欲しいと言っ< 810010010513たので、それが実際には であると仮定します):<=

ALTER PROCEDURE dbo.AddCards
  @cnt BIGINT
AS
BEGIN
    SET NOCOUNT ON;

    --INSERT dbo.prepaidbooks
    --(
    --   sbarcode, sdescription, lServiceId, iQty, 
    --   dblWashValue, dblBookPrice, lLocationId, lBookTypeId
    --)  
    SELECT rn, 'Dealer Car Wash' --, 43, 1, 9, 0, 1, 7
    FROM 
    (
      SELECT TOP (CONVERT(INT, 810010010513 - (@cnt)) + 1) rn = 
        810010010513 - (ROW_NUMBER() OVER (ORDER BY [object_id]) - 1)
      FROM sys.all_objects
      ORDER BY [object_id]
    ) AS y
    ORDER BY rn;
END
GO

EXEC dbo.AddCards 810010010511;

結果:

810010010511  Dealer Car Wash
810010010512  Dealer Car Wash
810010010513  Dealer Car Wash

出力に満足したら、そのINSERT部分 (出力をテストできるように省略しました) と残りのSELECTリスト (簡潔にするために省略しただけです) のコメントを外します。

また、パラメーターの名前を変更することをお勧めします。これはあまり直感的ではありません。厳密には、カウントを渡していません。実際に渡しているのは、カウントを開始したい場所のある種のマーカーです。

于 2012-06-12T22:13:59.923 に答える