Generare identificatori univoci in una tabella warehouse in Microsoft Fabric

Si applica a✅: magazzino in Microsoft Fabric

È un requisito comune nei data warehouse per assegnare un identificatore univoco a ogni riga di una tabella. Negli ambienti basati su SQL Server in genere eseguiti creando una colonna Identity in una tabella, tuttavia questa funzionalità non è supportata in un warehouse in Microsoft Fabric. È invece necessario usare una tecnica alternativa.

Tecnica alternativa

Questo articolo descrive una tecnica alternativa che genera identificatori univoci in una tabella warehouse.

Passaggio 1: Creare una tabella con una colonna identificatore

Prima di tutto, è necessario creare una tabella che includa una colonna che archivia i valori di identificatore univoco. Il tipo di dati della colonna deve essere impostato su int o bigint, a seconda del volume di dati che si prevede di archiviare. È inoltre necessario definire la colonna come NOT NULL per assicurarsi che a ogni riga venga assegnato un identificatore.

Il codice seguente crea una tabella di esempio denominata Orders_with_Identifier nello dbo schema.

--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

Passaggio 2: Determinare l'ultimo valore dell'identificatore

Prima di inserire righe nella tabella, è necessario determinare l'ultimo valore dell'identificatore archiviato nella tabella. A tale scopo, è possibile recuperare il valore massimo dell'identificatore. Questo valore deve essere assegnato a una variabile in modo che sia possibile farvi riferimento quando si inseriscono righe di tabella (nel passaggio successivo).

Il codice seguente assegna l'ultimo valore dell'identificatore a una variabile denominata @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;

Passaggio 3: Inserire valori di identificatore univoco

Quando si inseriscono righe nella tabella, i numeri univoci e sequenziali vengono calcolati aggiungendo il valore della @MaxID variabile ai valori restituiti dalla funzione ROW_NUMBER . Questa funzione è una funzione window che calcola un numero di riga sequenziale a partire da 1.

Il codice seguente, eseguito nello stesso batch dello script nel passaggio 2, inserisce righe nella Orders_with_Identifier tabella. I valori per la Row_ID colonna vengono calcolati aggiungendo la @MaxID variabile ai valori restituiti dalla ROW_NUMBER funzione . La funzione deve avere una ORDER BY clausola che definisce l'ordine logico delle righe all'interno del set di risultati. Tuttavia, quando è impostato su SELECT NULL, non viene imposto alcun ordine logico, ovvero i valori dell'identificatore vengono assegnati arbitrariamente. Questa ORDER BY clausola comporta tempi di esecuzione più rapidi.

--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];