在SQL Server中插入多行

时间:2013-02-10 09:33:47

标签: sql-server-2005 insert

我有两张桌子

Product (product_id, productName)
ProductSerialNumber (ProductSerialNumber_id, product_id, serialNumber, status)

产品的序列号12345679000123456790100(数量:90):MILK

有没有办法在不使用多个插入的情况下执行此操作,即

$Sn = 12345679000;
while ($Sn <= 123456790100 )
{
  INSERT INTO ProductSerialNumber VALUES(...,...,$Sn,...)
  $Sn++;

}

2 个答案:

答案 0 :(得分:1)

你可以这样做:

WITH Temp
AS
(
   SELECT n
   FROM(VALUES(0), (1), (2), (3), (4), (5), (6), (7), (8), (9)) AS Temp(n)
), nums
AS
(
   SELECT id = t1.n * 10 + t2.n + 1
   FROM temp AS T1
   CROSS JOIN temp AS t2
)
INSERT INTO ProductSerialNumber(serialnumber)
SELECT 12345679000 + id AS Serialnumber  -- You can insert into other columns too
FROM nums;

SQL Fiddle Demo

请注意:此语法FROM(VALUES(0), (1), ..., (9)) AS Temp(n)是SQL Server-2008的新增功能,对于旧版本,您可以使用SELECT ... UNION ALL SELECT ...

,如果可能,您可以更改此表格,并将此列SerialNumber设为IDENTITY(12345679000, 1),它将自动增量。


更新1

对于SQL Server 2005,请尝试以下方法:

WITH Temp
AS
(
  SELECT 1 AS id
  UNION ALL
  SELECT 2
  UNION ALL
  SELECT 3
  UNION ALL
  SELECT 4
), nums
AS
(
  SELECT ROW_NUMBER() OVER(ORDER BY t1.id) AS id
  FROM temp t1, temp t2, temp t3, temp t4
)
INSERT INTO ProductSerialNumber(serialnumber)
SELECT 12345679000 + id AS Serialnumber
FROM nums
WHERE id <= 100;

Updated SQL Fiddle Demo


更新2

* 此查询如何工作? *

首先,我定义一个只有四个值的虚拟表:

  SELECT 1 AS id
  UNION ALL
  SELECT 2
  UNION ALL
  SELECT 3
  UNION ALL
  SELECT 4

我在Common table expression(CTE)中定义了它,以便以后重复使用。

然后在下面的CTE中,我使用了:

FROM temp t1, temp t2, temp t3, temp t4

这将自动加入表temp四次,因此它会给你: 4 4 = 256 行。然后我使用ranking function ROW_NUMBER()作为一轮工作来生成1到265之间的序号。

最后一个是INSERT INTO ... SELECT ...的语法,用于选择我们已经从上一步生成的数字的数字<= 100,并将它们插入到表中。

希望这是有道理的。

答案 1 :(得分:0)

这是另一种使用过程

插入多行的方法
CREATE PROCEDURE autoInsert
@SerialNumberStart bigint,
@SerialNumberEnd bigint,
@status int,
@productID int
AS   
while @SerialNumberStart <= @SerialNumberEnd
begin
BEGIN TRAN

INSERT INTO ProductSerialNumber VALUES(@SerialNumberStart)
--print @SerialNumberStart

COMMIT TRAN;
set @SerialNumberStart=@SerialNumberStart+ 1
end