共用方式為


在 Microsoft Fabric 的倉儲資料表中產生唯一識別碼

適用於✅:Microsoft Fabric 的倉儲

這是資料倉儲中將唯一識別碼指派給資料表每個資料列的常見需求。 在通常藉由在資料表中建立身分識別資料行來完成的 SQL Server 型環境中,Microsoft Fabric 的倉儲不支援此功能。 相反,您必須使用因應措施技術。

因應措施技術

本文說明在倉儲資料表中產生唯一識別碼的因應措施技術。

步驟 1:建立具有識別碼資料行的資料表

首先,您應該建立資料表,其中包含儲存唯一識別碼值的資料行。 資料行資料類型應設定為 int 或 bigint,視您預期儲存的資料量而定。 您也應將資料行定義為 NOT NULL,以確保為每個資料列指派識別碼。

下列程式碼會在 dbo 結構描述中建立名為 Orders_with_Identifier 的範例資料表。

--Drop a table named 'Orders_with_Identifier' in schema 'dbo', if it exists
IF OBJECT_ID('[dbo].[Orders_with_Identifier]', 'U') IS NOT NULL
    DROP TABLE [dbo].[Orders_with_Identifier];
GO

CREATE TABLE [dbo].[Orders_with_Identifier] (
    [Row_ID] BIGINT NOT NULL,
    [O_OrderKey] BIGINT NULL,
    [O_CustomerKey] BIGINT NULL,
    [O_OrderStatus] VARCHAR(1) NULL,
    [O_TotalPrice] DECIMAL(15, 2) NULL,
    [O_OrderDate] DATE NULL,
    [O_OrderPriority] VARCHAR(15) NULL,
    [O_Clerk] VARCHAR (15) NULL,
    [O_ShipPriority] INT NULL,
    [O_Comment] VARCHAR (79) NULL
);
GO

步驟 2:判定最後一個識別碼值

在將資料列插入資料表之前,必須判定儲存在資料表中的最後一個識別碼值。 您可以藉由擷取最大的識別碼值來執行此動作。 此值應該指派給變數,以便在將資料列插入資料表時 (在下一個步驟中) 可以參考。

下列程式碼會將最後一個識別碼指派給名為 @MaxID 的變數。

--Assign the last identifier value to a variable
--If the table doesn't contain any rows, assign zero to the variable
DECLARE @MaxID AS BIGINT;

IF EXISTS(SELECT * FROM [dbo].[Orders_with_Identifier])
    SET @MaxID = (SELECT MAX([Row_ID]) FROM [dbo].[Orders_with_Identifier]);
ELSE
    SET @MaxID = 0;

步驟 3:插入唯一識別碼值

當您將資料列插入資料表時,會將 @MaxID 變數的值新增至 ROW_NUMBER 函數傳回的值,藉以計算唯一和循序編號。 此函數是一個視窗函數,可計算從 1 開始的循序資料列編號。

下列程式碼在與步驟 2 中指令碼相同的批次中執行,會將資料列插入 Orders_with_Identifier 資料表中。 Row_ID 資料行的值藉由將 @MaxID 變數新增至 ROW_NUMBER 函數傳回的值來計算。 函數必須有 ORDER BY 子句,該定名定義結果集中資料列的邏輯順序。 不過,將其設定為 SELECT NULL 時,不會強加任何邏輯順序,這意味著會任意指派識別碼值。 這個 ORDER BY 子句會導致執行時間更快。

--Insert new rows with unique identifiers
INSERT INTO [dbo].[Orders_with_Identifier]
SELECT
    @MaxID + ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS [Row_ID],
    [src].[O_OrderKey],
    [src].[O_CustomerKey],
    [src].[O_OrderStatus],
    [src].[O_TotalPrice],
    [src].[O_OrderDate],
    [src].[O_OrderPriority],
    [src].[O_Clerk],
    [src].[O_ShipPriority],
    [src].[O_Comment]
FROM [dbo].[Orders] AS [src];