加载维度表

已完成

暂存维度数据后,可以使用 SQL 将其加载到维度表中。

使用 CREATE TABLE AS (CTAS) 语句

将数据加载到新维度表中的最简单方法之一是使用 CREATE TABLE AS (CTAS) 表达式。 此语句基于 SELECT 语句的结果创建新表。

CREATE TABLE dbo.DimProduct
WITH
(
    DISTRIBUTION = REPLICATE,
    CLUSTERED COLUMNSTORE INDEX
)
AS
SELECT ROW_NUMBER() OVER(ORDER BY ProdID) AS ProdKey,
    ProdID as ProdAltKey,
    ProductName,
    ProductCategory,
    Color,
    Size,
    ListPrice,
    Discontinued
FROM dbo.StageProduct;

注意

使用 CTAS 语句时,不能使用 IDENTITY 为代理键生成唯一的整数值,因此本示例使用 ROW_NUMBER 函数为临时数据中按 ProductID 业务键排序的结果中的每一行生成一个递增的行号。

还可以采用另一种方法将新数据和更新的数据组合加载到维度表中:使用 CREATE TABLE AS (CTAS) 语句创建一个新表,其中将维度表中的现有行与临时表中的新记录和更新的记录联合起来。 创建了新表后,可以删除或重命名当前维度表,并重命名新表以替换它。

CREATE TABLE dbo.DimProductUpsert
WITH
(
    DISTRIBUTION = REPLICATE,
    CLUSTERED COLUMNSTORE INDEX
)
AS
-- New or updated rows
SELECT  stg.ProductID AS ProductBusinessKey,
        stg.ProductName,
        stg.ProductCategory,
        stg.Color,
        stg.Size,
        stg.ListPrice,
        stg.Discontinued
FROM    dbo.StageProduct AS stg
UNION ALL  
-- Existing rows
SELECT  dim.ProductBusinessKey,
        dim.ProductName,
        dim.ProductCategory,
        dim.Color,
        dim.Size,
        dim.ListPrice,
        dim.Discontinued
FROM    dbo.DimProduct AS dim
WHERE NOT EXISTS
(   SELECT  *
    FROM dbo.StageProduct AS stg
    WHERE stg.ProductId = dim.ProductBusinessKey
);

RENAME OBJECT dbo.DimProduct TO DimProductArchive;
RENAME OBJECT dbo.DimProductUpsert TO DimProduct;

虽然此方法在合并新维度数据和现有维度数据方面很有效,但缺乏对标识列的支持意味着很难生成代理键。

提示

有关详细信息,请参阅 Azure Synapse Analytics 文档中的 CREATE TABLE AS SELECT (CTAS)

使用 INSERT 语句

当你需要将临时数据加载到现有维度表时,可以使用 INSERT 语句。 如果临时数据仅包含新维度实体的记录(而不包含对现有实体的更新),则此方法有效。 此方法比上一部分中的方法简单得多,后者需要 UNION ALL,随后需要重命名表对象。

INSERT INTO dbo.DimCustomer
SELECT CustomerNo AS CustAltKey,
    CustomerName,
    EmailAddress,
    Phone,
    StreetAddress,
    City,
    PostalCode,
    CountryRegion
FROM dbo.StageCustomers

注意

假设 DimCustomer 维度表是使用代理键(如上一单元中所述)的 IDENTITY CustomerKey 列定义的,则会自动生成键,其余列将使用 SELECT 查询从临时表中检索到的值进行填充。