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

问题描述 投票:0回答:5

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

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

sql sql-server t-sql insert
5个回答
13
投票

例如,您可以使用原始定义并仅使用 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 中选择数字列表,它们实际上也不会插入到表中。


13
投票

更简单的方法是:

insert dbo.OrderStatus default values
go 500

这将插入 500 行默认值。


1
投票

如果计数表足够大,计数表方法可以插入多行的大集合。此计数表最多可处理 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

0
投票

我需要做类似的事情...将大约 24,000 条记录插入我们的仓库货架系统。所以..

如果您的表已经包含要插入到新表中的记录数,您可以执行以下操作:

;with t as (
    select top 10000  ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) n
    from products -- we really only need 60 but for the purpose of this example...
)
--insert into binlocs (warehouse, zone, row, rack, shelf, bin)
SELECT 101 warehouse, 20 zone, tRow.n row ,tRack.n rack, tShelf.n shelf, tBin.n bin
FROM t tRow
    join t tRack on tRack.n<=case -- how many racks per row
                                    when tRow.n=1 then 37 
                                    when tRow.n=2 then 38 
                                    when tRow.n=3 then 60
                                    when tRow.n=4 then 60 
                                    when tRow.n=5 then 60 
                                    when tRow.n=6 then 40 
                                    when tRow.n=7 then 40 
                                    when tRow.n=8 then 40 
                                    when tRow.n=9 then 38 
                                    when tRow.n=10 then 38 
                                end
    join t tShelf on tShelf.n<7 -- default to 6 shelves per rack
    Join t tBin on tBin.n<10 -- default to 9 bins per shelf
where tRow.n<=10 -- we need 10 rows
order by tRow.n,tRack.n,tShelf.n,tBin.n

-2
投票

创建新行时设置触发器:

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

© www.soinside.com 2019 - 2024. All rights reserved.