#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)