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或使用较小的数字(上升int2147483648

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作为第二个参数传递给存储过程 - 如下所示:

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 借用更新的签名(并假设这< 810010010513确实应该是<=,因为你说你想要 3 本书,而不是 2):

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 回答