Generieren eindeutiger Bezeichner in einer Microsoft Fabric Warehouse-Tabelle
Gilt für:✅ Warehouse in Microsoft Fabric
Es ist eine häufige Anforderung in Data Warehouses, jeder Zeile einer Tabelle einen eindeutigen Bezeichner zuzuweisen. In SQL Server-basierten Umgebungen erfolgt dies in der Regel durch Erstellen einer Identitätsspalte in einer Tabelle. Dieses Feature wird jedoch in einem Warehouse in Microsoft Fabric derzeit nicht unterstützt. Sie müssen stattdessen eine Methode zur Problemumgehung verwenden. Wir zeigen Ihnen zwei Alternativen.
In diesem Artikel werden Methoden zur Problemumgehung beschrieben, die eindeutige Bezeichner in einer Warehouse-Tabelle generieren.
Methode 1
Diese Methode ist am besten anwendbar, wenn Sie Identitätswerte erstellen müssen, die Reihenfolge der Werte jedoch nicht wichtig ist (nichtsequentiale Werte sind akzeptabel).
Eindeutige Werte werden im Code generiert, der Daten in die Tabelle einfügt.
Um mithilfe dieser Methode eindeutige Daten zu erzeugen, erstellen Sie eine Tabelle, die eine Spalte enthält, in der eindeutige Bezeichnerwerte gespeichert werden. Der Spaltendatentyp sollte auf bigint festgelegt werden. Sie sollten außerdem die Spalte
NOT NULL
definieren, um sicherzustellen, dass jeder Zeile ein Bezeichner zugewiesen wird.Im folgenden T-SQL-Codebeispiel wird eine Beispieltabelle namens
Orders_with_Identifier
imdbo
-Schema erstellt, in der die SpalteRow_ID
als eindeutiger Schlüssel dient.--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 );
Wenn Sie Zeilen in die Tabelle einfügen, generieren Sie über T-SQL-Skripts oder Anwendungscode oder anderweitig eindeutige Daten für
Row_ID
mit derNEWID()
-Funktion. Diese Funktion generiert einen eindeutigen Wert vom Typ uniqueidentifier, der dann umgewandelt und als bigint gespeichert werden kann.Der folgende Code fügt Zeilen in die
dbo.Orders_with_Identifier
-Tabelle ein. Die Werte für dieRow_ID
-Spalte werden berechnet, indem die von dernewid()
-Funktion zurückgegebenen Werte konvertiert werden. Die Funktion erfordert keineORDER BY
-Klausel und generiert für jeden Datensatz einen neuen Wert.--Insert new rows with unique identifiers INSERT INTO [dbo].[Orders_with_Identifier] SELECT CONVERT(BIGINT, CONVERT(VARBINARY, CONCAT(NEWID(), GETDATE()))) 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];
Methode 2
Diese Methode ist am besten geeignet, wenn Sie sequenzielle Identitätswerte erstellen müssen, sollte jedoch für größere Datasets mit Vorsicht verwendet werden, da sie langsamer als alternative Methoden sein kann. Auch wenn mehrere Prozesse gleichzeitig Daten einfügen, sollten Sie diese Methode überdenken, da sie zu doppelten Werten führen könnte.
Um mithilfe dieser Methode eindeutige Daten zu erzeugen, erstellen Sie eine Tabelle, die eine Spalte enthält, in der eindeutige Bezeichnerwerte gespeichert werden. Der Datentyp der Spalte sollte abhängig vom erwarteten Datenspeichervolumen auf int oder bigint festgelegt werden. Sie sollten außerdem die Spalte
NOT NULL
definieren, um sicherzustellen, dass jeder Zeile ein Bezeichner zugewiesen wird.Im folgenden T-SQL-Codebeispiel wird eine Beispieltabelle namens
Orders_with_Identifier
imdbo
-Schema erstellt, in der die SpalteRow_ID
als eindeutiger Schlüssel dient.--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
Bevor Sie Zeilen in die Tabelle einfügen, müssen Sie den letzten in der Tabelle gespeicherten Bezeichnerwert ermitteln. Dazu können Sie den maximalen Bezeichnerwert abrufen. Dieser Wert sollte einer Variablen zugewiesen werden, damit Sie beim Einfügen von Tabellenzeilen (im nächsten Schritt) darauf verweisen können.
Mit dem folgenden Code wird der letzte Bezeichnerwert einer Variablen mit dem Namen
@MaxID
zugewiesen.--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;
Wenn Sie Zeilen in die Tabelle einfügen, werden eindeutige und sequenzielle Zahlen berechnet, indem der Wert der Variablen
@MaxID
zu den von der ROW_NUMBER-Funktion zurückgegebenen Werten hinzugefügt wird. Diese Funktion ist eine Fensterfunktion, die eine fortlaufende Zeilennummer berechnet, beginnend mit1
.Der folgende T-SQL-Code, der im selben Batch wie das Skript in Schritt 2 ausgeführt wird, fügt Zeilen in die Tabelle
Orders_with_Identifier
ein. Die Werte für die SpalteRow_ID
werden berechnet, indem die Variable@MaxID
Werten hinzugefügt wird, die von der FunktionROW_NUMBER
zurückgegeben werden. Die Funktion muss über eineORDER BY
-Klausel verfügen, die die logische Reihenfolge der Zeilen innerhalb des Resultsets definiert. Wenn sie jedoch aufSELECT NULL
gesetzt ist, wird keine logische Reihenfolge vorgeschrieben, d. h. Bezeichnerwerte werden willkürlich zugewiesen. DieseORDER BY
-Klausel führt zu einer schnelleren Ausführungszeit.--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];