小编典典

如何在表中插入N行默认值

sql

我有一个包含标识列和代表创建日期的列的表:

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()),因此我可以添加一行,这要归功于DEFAULTVALUES

INSERT INTO dbo.OrderStatus DEFAULT VALUES;

但是,如果我想添加三个记录,该怎么办?

当前解决方案(编辑了一些输入,因为它没有任何意义)

现在,为了做我想做的,我添加了几行VALUES

INSERT INTO dbo.OrderStatus (CreationDate)
VALUES  (GETDATE()), 
        (GETDATE()), 
        (GETDATE())

虽然,我更希望知道INSERT INTO .. DEFAULT VALUES多行的等效项,以防稍后添加另一列具有默认值的列。

有没有办法用DEFAULT VALUES或类似的方法将N行插入表中?


阅读 142

收藏
2021-03-23

共1个答案

小编典典

例如,您可以使用原始定义,而仅使用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,您必须指定OPTION(MAXRECURSION ...)它是否大于100。还要注意,即使您从CTE中选择了一个数字列表,它们实际上也不会插入表中。

2021-03-23