【问题标题】:Sql Insert the same row multiple timesSql 多次插入同一行
【发布时间】:2015-07-23 06:38:17
【问题描述】:

我正在尝试编写一个存储过程,它将从如下表中的表中获取行

并将它们插入与数量列的值一样多的次数。它还应该为插入的行分配一个唯一的名称和编号。

最终结果应该类似于下面的屏幕截图

我可以通过下面的 SQL 非常接近我想要的 Source

INSERT INTO dbo. MyTable (....)
SELECT
    t1.Name + ' (' +   CAST(E.n as VARCHAR(3)) + ')',
    @Prefix + ' - ' + ROW_NUMBER () OVER (ORDER BY t1.Name )
FROM
    MyFirstTable t1
    JOIN ....
    JOIN .....
CROSS JOIN
    (SELECT TOP 500 ROW_NUMBER() OVER(ORDER BY (SELECT 1)) FROM sys.columns)E(n)
WHERE 
    E.n <= t1.Quantity
    AND....

上述声明有效,因为我知道数量永远不会超过 500,但我不喜欢它的完成方式。有没有更好的方法来做到这一点?

我在 sql 方面不是很有经验。

【问题讨论】:

  • 使用table of numbers 没有任何问题。我个人在数据库中有一个包含 10 万个数字的实际表,而不是像你那样动态生成它。
  • 点赞!我喜欢这篇文章。信息量很大。不幸的是,使用这种方法很难让我的项目中的其他开发人员参与进来。

标签: sql-server sql-server-2012


【解决方案1】:

似乎您已经弄清楚了大部分需要什么。至于top 500 不超过,您可以将其留在那里或将其删除。我认为这就是您可能正在寻找的:

SELECT
    id,        --not sure where this id comes from but looks different in your output
    CASE 
      WHEN E.n-1 > 0
        THEN t1.Name + ' (' +   CAST(E.n-1 as VARCHAR(3)) + ')'
     ELSE t1.Name
     END as  Name,
    @prefix + ' - ' + cast(ROW_NUMBER () OVER (ORDER BY t1.id) as varchar(10)) as Number
FROM
    test t1
    JOIN ...
    JOIN ...
CROSS JOIN
    (SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) FROM sys.columns)E(n)
WHERE 
    E.n <= t1.Quantity
    AND ....;

SQL Fiddle Demo

【讨论】:

  • 如果没有前 500 名,Cross Join 不会让我感到困扰。谢谢 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-20
  • 2015-05-31
  • 2020-05-09
  • 1970-01-01
  • 2016-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多