ID列と作成日を表す列を含むテーブルがあります。
_CREATE TABLE dbo.OrderStatus
(
OrderStatusId int IDENTITY(1, 1) NOT NULL,
CreationDate datetime NOT NULL default GETDATE(),
CONSTRAINT PK_OrderStatus PRIMARY KEY(OrderStatusId)
)
_
ID列はそれ自体で値を生成し、CreationDateは常に現在の日付(GETDATE()
)になるため、_DEFAULT VALUES
_のおかげで行を追加できます。
_INSERT INTO dbo.OrderStatus DEFAULT VALUES;
_
しかし、たとえば3つのレコードを追加したい場合は、どうすればよいですか?
現在の解決策(意味がないため、一部の入力を編集しました)
今のところ、私がやりたいことをするために、VALUES
でいくつかの行を追加します。
_INSERT INTO dbo.OrderStatus (CreationDate)
VALUES (GETDATE()),
(GETDATE()),
(GETDATE())
_
ただし、後でデフォルト値で別の列を追加する場合に備えて、複数の行について_INSERT INTO .. DEFAULT VALUES
_に相当するものを知りたいと思います。
_DEFAULT VALUES
_または同様の方法でN行をテーブルに挿入する方法はありますか?
たとえば、元の定義を使用して、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から数値のリストを選択していても、実際には挿入されないことに注意してください。テーブル。
より簡単な方法は次のとおりです。
insert dbo.OrderStatus default values
go 500
これにより、500行のデフォルト値が挿入されます。
タリーテーブルメソッドは、タリーテーブルが十分に大きい場合、複数の行の大きなセットを挿入できます。このタリーテーブルは、最大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