適用於✅:Microsoft Fabric 的倉儲
這是資料倉儲中將唯一識別碼指派給資料表每個資料列的常見需求。 在 SQL Server 型環境中,這通常是藉由在數據表中建立 識別數據行 來完成,不過目前在 Microsoft Fabric 的倉儲中不支援此功能。 本文介紹在倉儲資料表中產生唯一識別碼的因應措施。
這很重要
如果多個進程同時插入數據,您可能會得到重複的值。
建立包含儲存唯一識別碼值之欄的資料表。 資料行資料類型應設定為 int 或 bigint,視您預期儲存的資料量而定。 您也應將資料行定義為
NOT NULL,以確保為每個資料列指派識別碼。下列 T-SQL 程式代碼範例會在架構中建立名為
Orders_with_Identifier的dbo範例數據表,其中數據Row_ID行可作為唯一索引鍵。--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在將資料列插入資料表之前,必須判定儲存在資料表中的最後一個識別碼值。 您可以藉由擷取最大的識別碼值來執行此動作。 此值應該指派給變數,以便在將資料列插入資料表時 (在下一個步驟中) 可以參考。
下列程式碼會將最後一個識別碼指派給名為
@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;當您將資料列插入資料表時,會將
@MaxID變數的值新增至 ROW_NUMBER 函數傳回的值,藉以計算唯一和循序編號。 此函式是一個視窗函式,可計算從 開始的1循序數據列編號。下列 T-SQL 程式代碼會在與步驟 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];