【问题标题】:How can INSERT INTO a table 300 times within a loop in SQL?如何在 SQL 的循环中插入表 300 次?
【发布时间】:2014-03-22 15:27:43
【问题描述】:

我想在 SQL 中插入从计数器检索到的值并重复 300 次。

类似:

DECLARE @Counter = 0;

-- BEGIN Loop 
    SET @Counter = @Counter + 1 
    INSERT INTO tblFoo VALUES(@Counter)
-- REPEAT 300 times

我怎样才能做到这一点? 谢谢

【问题讨论】:

  • 在 SQL 中,一般应该尽量编写基于集合的代码,而不是程序化的,一步一步的代码。所以,要问的 SQLish 问题是“如何在我的表中插入 300 行,其中每行在 1-300 范围内获得一个唯一值?”

标签: sql-server tsql loops insert


【解决方案1】:

你可以这样试试:

DECLARE @i int = 0
WHILE @i < 300 
BEGIN
    SET @i = @i + 1
    /* your code*/
END

【讨论】:

  • 不可以通过使用SET设置变量来写同样的循环吗?
  • 对于许多 GUID,请使用 insert into table_1 values(NEWID())
【解决方案2】:

如果可以的话,我一般会防止循环,设置方法更有效:

INSERT INTO tblFoo
  SELECT TOP (300) n = ROW_NUMBER()OVER (ORDER BY [object_id]) 
  FROM sys.all_objects ORDER BY n;

Demo

Generate a set or sequence without loops

【讨论】:

  • 感谢蒂姆的回答。问题:所以我在这里假设肯定有 300 个 sys.all_objects 吗?如果我想插入一万个呢?
  • @pencilCake:我建议阅读我发布的文章。它还展示了其他技术。实际上,您会遇到两千多个上述方法的问题。我会使用数字表。
  • 另一方面,如果循环在 SQL 中不是个好主意,那么我想知道他们为什么在 T-SQL 中引入 WHILE 循环?
  • @pencilCake:有些事情没有循环是不可能的,或者至少不值得实现基于集合的方法(这可能需要更多时间)。因此,如果您只执行一次,则使用循环可能就足够了。但是很多人(尤其是程序员)使用循环并继续在 sql 中使用它们。
【解决方案3】:
DECLARE @first AS INT = 1
DECLARE @last AS INT = 300

WHILE(@first <= @last)
BEGIN
    INSERT INTO tblFoo VALUES(@first)
    SET @first += 1
END

【讨论】:

    【解决方案4】:

    在 ssms 中我们可以使用 GO 来执行相同的语句

    编辑 这意味着如果你把

     some query
    
     GO n
    

    某些查询将被执行 n 次

    【讨论】:

      【解决方案5】:

      找到了一些不同的答案,我将它们结合起来解决模拟问题:

      CREATE TABLE nummer (ID INTEGER PRIMARY KEY, num, text, text2);
      WITH RECURSIVE
        for(i) AS (VALUES(1) UNION ALL SELECT i+1 FROM for WHERE i < 1000000)
      INSERT INTO nummer SELECT i, i+1, "text" || i, "otherText" || i FROM for;
      

      添加 1 miljon 行

      • id 每迭代一次就增加一个
      • num 比 id 大一
      • 文本与 id-number 连接,例如:text1、text2 ... text1000000
      • text2 与 id-number 连接,例如:otherText1、otherText2 ... otherText1000000

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-08
        • 1970-01-01
        • 2021-09-21
        • 1970-01-01
        • 1970-01-01
        • 2019-02-06
        • 2015-03-16
        • 1970-01-01
        相关资源
        最近更新 更多