web-dev-qa-db-ja.com

N行のデフォルト値をテーブルに挿入する方法

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行をテーブルに挿入する方法はありますか?

10
actaram

たとえば、元の定義を使用して、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から数値のリストを選択していても、実際には挿入されないことに注意してください。テーブル。

12
Dan Field

より簡単な方法は次のとおりです。

insert dbo.OrderStatus default values
go 500

これにより、500行のデフォルト値が挿入されます。

11

タリーテーブルメソッドは、タリーテーブルが十分に大きい場合、複数の行の大きなセットを挿入できます。このタリーテーブルは、最大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
Jens Frandsen