想知道通过 ADF 生成关系身份的最佳方法是什么。
现在,我正在使用没有任何身份信息的 JSON 数据。然后将此数据转换为具有关系(1..n 等)的多个数据库接收器表。由于某些目标接收器表的 FK 约束,这些关系需要一次“建立”一个。
这种方法似乎有点笨拙,所以我想看看是否还有其他我不知道的选项。
请注意,我需要为每个插入包含代理键生成。如果我不这样做,基于输出数据库模式,我将收到“无法插入 PK null”错误。
另请注意,我IDENTITY_INSERT
为每个接收器打开/关闭。
想知道通过 ADF 生成关系身份的最佳方法是什么。
现在,我正在使用没有任何身份信息的 JSON 数据。然后将此数据转换为具有关系(1..n 等)的多个数据库接收器表。由于某些目标接收器表的 FK 约束,这些关系需要一次“建立”一个。
这种方法似乎有点笨拙,所以我想看看是否还有其他我不知道的选项。
请注意,我需要为每个插入包含代理键生成。如果我不这样做,基于输出数据库模式,我将收到“无法插入 PK null”错误。
另请注意,我IDENTITY_INSERT
为每个接收器打开/关闭。
我倾向于采用更多 ELT 方法并使用 Azure SQL DB 中的本机 JSON 功能,即OPENJSON
. 您可以使用 ADF(例如,存储过程活动)将 JSON 放入 Azure SQL DB 中的表中,然后调用另一个存储过程来处理 JSON,如下所示:
-- Setup
DROP TABLE IF EXISTS #tmp
DROP TABLE IF EXISTS import.City;
DROP TABLE IF EXISTS import.Region;
DROP TABLE IF EXISTS import.Country;
GO
DROP SCHEMA IF EXISTS import
GO
CREATE SCHEMA import
CREATE TABLE Country ( CountryKey INT IDENTITY PRIMARY KEY, CountryName VARCHAR(50) NOT NULL UNIQUE )
CREATE TABLE Region ( RegionKey INT IDENTITY PRIMARY KEY, CountryKey INT NOT NULL FOREIGN KEY REFERENCES import.Country, RegionName VARCHAR(50) NOT NULL UNIQUE )
CREATE TABLE City ( CityKey INT IDENTITY(100,1) PRIMARY KEY, RegionKey INT NOT NULL FOREIGN KEY REFERENCES import.Region, CityName VARCHAR(50) NOT NULL UNIQUE )
GO
DECLARE @json NVARCHAR(MAX) = '{
"Cities": [
{
"Country": "England",
"Region": "Greater London",
"City": "London"
},
{
"Country": "England",
"Region": "West Midlands",
"City": "Birmingham"
},
{
"Country": "England",
"Region": "Greater Manchester",
"City": "Manchester"
},
{
"Country": "Scotland",
"Region": "Lothian",
"City": "Edinburgh"
}
]
}'
SELECT *
INTO #tmp
FROM OPENJSON( @json, '$.Cities' )
WITH
(
Country VARCHAR(50),
Region VARCHAR(50),
City VARCHAR(50)
)
GO
-- Add the Country first (has no foreign keys)
INSERT INTO import.Country ( CountryName )
SELECT DISTINCT Country
FROM #tmp s
WHERE NOT EXISTS ( SELECT * FROM import.Country t WHERE s.Country = t.CountryName )
-- Add the Region next including Country FK
INSERT INTO import.Region ( CountryKey, RegionName )
SELECT t.CountryKey, s.Region
FROM #tmp s
INNER JOIN import.Country t ON s.Country = t.CountryName
-- Now add the City with FKs
INSERT INTO import.City ( RegionKey, CityName )
SELECT r.RegionKey, s.City
FROM #tmp s
INNER JOIN import.Country c ON s.Country = c.CountryName
INNER JOIN import.Region r ON s.Region = r.RegionName
AND c.CountryKey = r.CountryKey
SELECT * FROM import.City;
SELECT * FROM import.Region;
SELECT * FROM import.Country;
这是一个简单的测试脚本,旨在展示这个想法,应该端到端运行,但它不是生产代码。