0

我有两张桌子

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++;

}
4

2 回答 2

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 小提琴演示

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

但是,如果可能,您可以更改此表并将此列设为SerialNumberan 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;

更新了 SQL Fiddle 演示


更新 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行。然后我使用排序函数ROW_NUMBER()作为一个工作循环来生成一个从 1 到 265 的数字序列号。

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

希望这是有道理的。

于 2013-02-10T09:40:28.970 回答
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
于 2013-02-11T12:48:21.617 回答