基于 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)
我已经将一些数据压缩到表 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)