Динамическая вставка в таблицу A на основе Row_Num из таблицы B

#sql #sql-server #tsql #sql-insert

#sql #sql-сервер #tsql #sql-вставка

Вопрос:

Я сжал некоторые данные в таблицу B, которая выглядит следующим образом:

  ======== ========== ========= 
| AreaID | AreaName | Row_Num | 
 ======== ========== ========= 
|   506  | BC-VanW  |    1    |
 -------- ---------- --------- 
|   3899 | BC-VicS  |    2    |
 -------- ---------- --------- 
|   1253 | AB-CalW  |    3    |
 -------- ---------- --------- 
  

Всего 2000 уникальных строк, Row_Num от 1 до 2000, и каждая область в этой таблице, естественно, также уникальна.

Теперь я хочу вставить в пустую таблицу TableA, в которой есть следующие столбцы:

  ======== ========== ========= ============ =========== 
| AreaID | StartDT  |  EndDT  | MarketCode |Allocation |
 ======== ========== ========= ============ =========== 
  

Оператор insert, который я хочу использовать, повторяет все, кроме AreaID

Я пытался сделать некоторые вещи ранее, и это базовый взгляд на то, что у меня есть, и я надеюсь, что Stackoverflow поможет мне расширить:

 DECLARE @AreaID NVARCHAR(4)
SET @AreaID = (SELECT AreaID FROM TableB WHERE Row_Num = 1)

DECLARE @Sql NVARCHAR(MAX)

SET @Sql = N'                   
INSERT INTO TableA (AreaID, StartDt, EndDt, MarketCode, Allocation) VALUES (' @AreaID ', ''2020-11-01 00:00:00.000'', ''2049-12-31 00:00:00.000'' , 31 , 25.00);
INSERT INTO TableA (AreaID, StartDt, EndDt, MarketCode, Allocation) VALUES (' @AreaID ', ''2020-11-01 00:00:00.000'', ''2049-12-31 00:00:00.000'' , 38 , 60.00);
INSERT INTO TableA (AreaID, StartDt, EndDt, MarketCode, Allocation) VALUES (' @AreaID ', ''2020-11-01 00:00:00.000'', ''2049-12-31 00:00:00.000'' , 39 , 15.00);
'
EXEC sp_executesql @Sql
GO
  

Отсюда я бы хотел, чтобы он «перебирал» Row_Nums, один и только один раз, и выполнял полный запрос insert выше, в конечном итоге делая это для всех 2000 Row_Nums.

Конечно, если есть более эффективный способ, пожалуйста, дайте мне знать, и я посмотрю.

Спасибо!

Комментарии:

1. Кроме того: отличный способ познакомиться с таблицами Bobby — объединить данные в динамический оператор SQL. Использование sp_executesql с параметрами — это безопасный способ обработки параметров.

Ответ №1:

Я думаю, вам нужно перекрестное соединение с фиксированным списком значений:

 INSERT INTO TableA (AreaID, StartDt, EndDt, MarketCode, Allocation)
SELECT b.AreaID, x.*
FROM tableB b
CROSS APPLY (VALUES 
    ('2020-11-01 00:00:00.000', '2049-12-31 00:00:00.000', 31, 25.00),
    ('2020-11-01 00:00:00.000', '2049-12-31 00:00:00.000', 38, 60.00),
    ('2020-11-01 00:00:00.000', '2049-12-31 00:00:00.000', 39, 15.00)
) x(StartDt, EndDt, MarketCode, Allocation)
  

Если диапазон дат всегда один и тот же, это можно немного упростить:

 INSERT INTO TableA (AreaID, StartDt, EndDt, MarketCode, Allocation)
SELECT b.AreaID, '2020-11-01 00:00:00.000', '2049-12-31 00:00:00.000', x.*
FROM tableB b
CROSS APPLY (VALUES 
    (31 , 25.00),
    (38 , 60.00),
    (39 , 15.00)
) x(MarketCode, Allocation)