基于 Table B 的 Row_Num 动态插入 Table A

Dynamically Insert into Table A Based on Row_Num from Table B

我已经将一些数据压缩到表 B 中,如下所示:

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

总共有2000个唯一行,Row_Num从1到2000,这个table中的每个AreaID自然也是唯一的。

我现在想插入一个空白的table,TableA,它有以下列:

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

我想使用的插入语句是重复除 AreaID 之外的所有内容

我早些时候尝试了一些事情,这是对我所拥有的东西的基本了解,我希望 Whosebug 可以帮助我扩展:

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

从这里我希望它 'loop' 通过 Row_Num 一次又一次,并且 运行 上面的完整插入查询最终为所有 2000 Row_Nums.

当然,如果有更高效的方法请告诉我,我会看看

谢谢!

我认为您想要一个具有固定值列表的交叉连接:

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)