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

时间:2015-06-09 19:55:40

标签: sql sql-server tsql insert

我有一个包含标识列的表以及表示创建日期的列:

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行插入表中?

4 个答案:

答案 0 :(得分:10)

更简单的方法是:

insert dbo.OrderStatus default values
go 500

这将插入500行默认值。

答案 1 :(得分:9)

您可以使用原始定义,只使用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中选择了一个数字列表,它们实际上也不会被插入进入表格。

答案 2 :(得分:0)

Tally Table方法可以插入大集合的多行,只要Tally表足够大即可。此Tally表最多可处理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

答案 3 :(得分:-2)

在新行CREATEd时设置触发器:

https://msdn.microsoft.com/en-us/library/ms189799.aspx