我有两张桌子
Product (product_id, productName)
ProductSerialNumber (ProductSerialNumber_id, product_id, serialNumber, status)
产品的序列号12345679000
至123456790100
(数量:90):MILK
有没有办法在不使用多个插入的情况下执行此操作,即
$Sn = 12345679000;
while ($Sn <= 123456790100 )
{
INSERT INTO ProductSerialNumber VALUES(...,...,$Sn,...)
$Sn++;
}
答案 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;
请注意:此语法FROM(VALUES(0), (1), ..., (9)) AS Temp(n)
是SQL Server-2008的新增功能,对于旧版本,您可以使用SELECT ... UNION ALL SELECT ...
。
但,如果可能,您可以更改此表格,并将此列SerialNumber
设为IDENTITY(12345679000, 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;
* 此查询如何工作? *
首先,我定义一个只有四个值的虚拟表:
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