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