将一个数据库 table 中的行插入到另一个数据库中的两个不同 table 中

Inserting rows from one database table into two different tables in another database

我需要将大约 600 条记录从一个数据库添加到另一个数据库。

第一部分像这样从 select 插入:

INSERT INTO RelayMapper.dbo.radioSignals(CstarID, StarName, SystemName, StarSystemCount, SuperNova, DateCreated)
SELECT NEWID(), startName, systemName, 1, 1,  getDate() 
FROM AISourceMapper.dbo.radioSignals 
WHERE rangeICW = 5

这就是它变得棘手的地方,我不知道该怎么做。

所以对于上面插入的每一行,我还需要将相关数据插入到另一个table。

上面的 NEWID() 将用于插入一行,然后我还需要从 AISourceMapper.dbo.radioSignals 插入 starCoordinates,它看起来像这样:

INSERT INTO RelayMapper.dbo.radioSources(CstarID, starCoordinates,  isVerified)
VALUES('1150C651-5D9A-4C13-9BE7-EF4AZ2549112', 'R.A. 13h 27m, DEC. -47deg, 29m', 1)

starCoordinates 也来自相同的 table 和我从中选择的行 (AISourceMapper.dbo.radioSignals)

有没有办法做这样的事情?

一个选项是将所有数据从 AISourceMapper.dbo.radioSignals 复制到一个临时文件 table 中,同时分配 GUID,然后从这个 table 插入您的目标 tables.

SELECT NEWID() AS CstarID, *
INTO #TempTable
FROM AISourceMapper.dbo.radioSignals 
WHERE rangeICW = 5

INSERT INTO RelayMapper.dbo.radioSignals( CstarID, StarName, SystemName, StarSystemCount, SuperNova, DateCreated )
SELECT CstarID, startName, systemName, 1, 1,  getDate() 
FROM #TempTable

INSERT INTO RelayMapper.dbo.radioSources( CstarID, starCoordinates,  isVerified )
SELECT CstarID, starCoordinates,  isVerified
FROM #TempTable

您可以使用 OUTPUT 子句获取插入的值,然后使用它们插入另一个 table。

DECLARE @insertedId TABLE(CStartID UNIQUEIDENTIFIER)

INSERT INTO RelayMapper.dbo.radioSignals(CstarID, StarName, SystemName, StarSystemCount, SuperNova, DateCreated)
OUTPUT inserted.CStarID INTO @insertedId
SELECT NEWID(), startName, systemName, 1, 1,  getDate() 
FROM AISourceMapper.dbo.radioSignals 
WHERE rangeICW = 5;

--with values clause
INSERT INTO RelayMapper.dbo.radioSources(CstarID, starCoordinates,  isVerified)
SELECT CStarId
'R.A. 13h 27m, DEC. -47deg, 29m', 1
FROM @insertedId;

--WITH select clause
INSERT INTO RelayMapper.dbo.radioSources(CstarID, starCoordinates,  isVerified)
SELECT i.CStarId, rs.starCoordinates, 1
FROM AISourceMapper.dbo.radioSignals AS rs
CROSS JOIN  @insertedId AS i
WHERE rs.rangeICW = 5;