Массовая вставка одной и той же строки несколько раз (N) - PullRequest
0 голосов
/ 20 апреля 2020

Есть ли способ BULK вставить ту же строку в таблицу на основе переменной N?

В основном:

INSERT INTO Table (FK_id, Somedate)
VALUES (3, GETDATE())
OVER 5000 ROWS

Я знаю, что могу объявить такие переменные, как @InsertedRows и увеличить его в течение некоторого времени l oop:

DECLARE @InsertedRows = 0;
WHILE (@InsertedRows < N)
  INSERT INTO Table (FK_id, Somedate)
  VALUES (3, GETDATE())

  @InsertedRows++
END WHILE

Но это несколько операторов вставки, а не 1 вызов вставки, что я бы предпочел. Есть ли способ сделать это?

Ответы [ 2 ]

2 голосов
/ 20 апреля 2020

Я считаю, что рекурсивное CTE достаточно просто сделать из памяти и работает довольно хорошо.

DECLARE @limit int = 5000;

;WITH x AS 
(
    SELECT n = 1 UNION ALL 
    SELECT n + 1 FROM x WHERE n < @limit
)
INSERT dbo.tablename(FK_id, Somedate) 
SELECT 3, GETDATE() FROM x
OPTION (MAXRECURSION 0);
2 голосов
/ 20 апреля 2020

Действительно простой способ в SSMS - это сделать:

INSERT INTO Table (FK_id, Somedate)
VALUES (3, GETDATE())
GO 5000

Но все равно это несколько вставок.

Вы можете выполнить одну вставку следующим образом:

WITH
    L0 AS (SELECT 1 AS c UNION ALL SELECT 1),
    L1 AS (SELECT 1 AS c FROM L0 A CROSS JOIN L0 B),
    L2 AS (SELECT 1 AS c FROM L1 A CROSS JOIN L1 B),
    L3 AS (SELECT 1 AS c FROM L2 A CROSS JOIN L2 B),
    L4 AS (SELECT 1 AS c FROM L3 A CROSS JOIN L3 B),
    L5 AS (SELECT 1 AS c FROM L4 A CROSS JOIN L4 B),
    Nums AS (SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS n FROM L5)
INSERT INTO Table(FK_id, Somedate)
SELECT TOP (5000) 
FK_id, Somedate
FROM Nums 
CROSS APPLY (VALUES (3,  GETDATE())) t (FK_id, Somedate)
ORDER BY n
...