如何将 N 行默认值插入 table
How to insert N rows of default values into a table
我有一个 table 包含一个标识列以及一个表示创建日期的列:
CREATE TABLE dbo.OrderStatus
(
OrderStatusId int IDENTITY(1, 1) NOT NULL,
CreationDate datetime NOT NULL default GETDATE(),
CONSTRAINT PK_OrderStatus PRIMARY KEY(OrderStatusId)
)
由于标识列自己生成一个值并且 CreationDate 始终是当前日期 (GETDATE()
),我可以添加一行感谢 DEFAULT VALUES
:
INSERT INTO dbo.OrderStatus DEFAULT VALUES;
但是如果我想添加,比方说,三个记录,我该怎么办?
当前解决方案(编辑了一些输入,因为它没有任何意义)
现在,为了做我想做的,我添加了几行 VALUES
:
INSERT INTO dbo.OrderStatus (CreationDate)
VALUES (GETDATE()),
(GETDATE()),
(GETDATE())
不过,我更愿意知道多行的 INSERT INTO .. DEFAULT VALUES
等价物,以防我稍后添加具有默认值的另一列。
有没有办法用 DEFAULT VALUES
或类似的方式将 N 行插入到 table 中?
您可以使用您的原始定义,只使用一个 while 循环,例如
DECLARE @OrderStatus TABLE
(
OrderStatusId int IDENTITY(1, 1) NOT NULL,
CreationDate datetime NOT NULL DEFAULT GETDATE()
--CONSTRAINT PK_OrderStatus PRIMARY KEY(OrderStatusId) -- this can be uncommented if creating a real table.
)
DECLARE @i int = 0;
WHILE @i < 100 -- insert 100 rows. change this value to whatever you want.
BEGIN
INSERT @OrderStatus DEFAULT VALUES
SET @i = @i + 1;
END
SELECT * FROM @OrderStatus
以下是使用递归 CTE 的方法:
;with cteNums(n) AS
(
SELECT 1
UNION ALL
SELECT n + 1
FROM cteNums WHERE n < 100 -- how many times to iterate
)
INSERT @OrderStatus
SELECT * FROM cteNums
请注意,对于 CTE,如果它大于 100,您必须指定 OPTION(MAXRECURSION ...)
。另请注意,即使您从 CTE 选择数字列表,它们实际上并不插入 table.
创建新行时设置触发器:
更简单的方法是:
insert dbo.OrderStatus default values
go 500
这将插入 500 行默认值。
Tally Table 方法可以插入多行的大集合,前提是 tally table 足够大。此 Tally table 最多可处理 1000 个条目。
WITH Tally (n) AS
(
-- 1000 rows
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) a(n)
CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) b(n)
CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) c(n)
)
--SELECT * FROM Tally;
Create Table #temp (id int, d datetime, GUID uniqueidentifier, str1 nvarchar(1), number int)
insert into #temp
select n, getdate(), newid(), 'a', 101 from tally
where N<=100 -- THIS IS WHERE YOU INDICATE HOW MANY ROWS
select * from #temp
我有一个 table 包含一个标识列以及一个表示创建日期的列:
CREATE TABLE dbo.OrderStatus
(
OrderStatusId int IDENTITY(1, 1) NOT NULL,
CreationDate datetime NOT NULL default GETDATE(),
CONSTRAINT PK_OrderStatus PRIMARY KEY(OrderStatusId)
)
由于标识列自己生成一个值并且 CreationDate 始终是当前日期 (GETDATE()
),我可以添加一行感谢 DEFAULT VALUES
:
INSERT INTO dbo.OrderStatus DEFAULT VALUES;
但是如果我想添加,比方说,三个记录,我该怎么办?
当前解决方案(编辑了一些输入,因为它没有任何意义)
现在,为了做我想做的,我添加了几行 VALUES
:
INSERT INTO dbo.OrderStatus (CreationDate)
VALUES (GETDATE()),
(GETDATE()),
(GETDATE())
不过,我更愿意知道多行的 INSERT INTO .. DEFAULT VALUES
等价物,以防我稍后添加具有默认值的另一列。
有没有办法用 DEFAULT VALUES
或类似的方式将 N 行插入到 table 中?
您可以使用您的原始定义,只使用一个 while 循环,例如
DECLARE @OrderStatus TABLE
(
OrderStatusId int IDENTITY(1, 1) NOT NULL,
CreationDate datetime NOT NULL DEFAULT GETDATE()
--CONSTRAINT PK_OrderStatus PRIMARY KEY(OrderStatusId) -- this can be uncommented if creating a real table.
)
DECLARE @i int = 0;
WHILE @i < 100 -- insert 100 rows. change this value to whatever you want.
BEGIN
INSERT @OrderStatus DEFAULT VALUES
SET @i = @i + 1;
END
SELECT * FROM @OrderStatus
以下是使用递归 CTE 的方法:
;with cteNums(n) AS
(
SELECT 1
UNION ALL
SELECT n + 1
FROM cteNums WHERE n < 100 -- how many times to iterate
)
INSERT @OrderStatus
SELECT * FROM cteNums
请注意,对于 CTE,如果它大于 100,您必须指定 OPTION(MAXRECURSION ...)
。另请注意,即使您从 CTE 选择数字列表,它们实际上并不插入 table.
创建新行时设置触发器:
更简单的方法是:
insert dbo.OrderStatus default values
go 500
这将插入 500 行默认值。
Tally Table 方法可以插入多行的大集合,前提是 tally table 足够大。此 Tally table 最多可处理 1000 个条目。
WITH Tally (n) AS
(
-- 1000 rows
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) a(n)
CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) b(n)
CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) c(n)
)
--SELECT * FROM Tally;
Create Table #temp (id int, d datetime, GUID uniqueidentifier, str1 nvarchar(1), number int)
insert into #temp
select n, getdate(), newid(), 'a', 101 from tally
where N<=100 -- THIS IS WHERE YOU INDICATE HOW MANY ROWS
select * from #temp