使用过程向表中添加多行

时间:2012-06-12 20:31:43

标签: sql sql-server stored-procedures

我正在尝试运行存储过程以将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]。

请帮忙。

由于

2 个答案:

答案 0 :(得分:4)

810010010511

int 太大 - 使用BIGINT或使用较小的数字(int最多{{1} }})

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

然后执行这样的存储过程:

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

答案 1 :(得分: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列表的其余部分(我只是将它们排除在外)为简洁起见。)

另外我建议你重命名参数 - 它不是很直观。严格来说,你没有通过计数;你真正传递的是你希望计数开始的某种标记。