你可以这样做:
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 ...
代替。
但是,如果可能,您可以更改此表并将此列设为SerialNumber
an 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
我们已经从上一步生成的数字的数字并将它们插入到表中的语法。
希望这是有道理的。