Freigeben über


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.

  1. 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 im dbo-Schema erstellt, in der die Spalte Row_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
    );
    
  2. 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 der NEWID()-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 die Row_ID-Spalte werden berechnet, indem die von der newid()-Funktion zurückgegebenen Werte konvertiert werden. Die Funktion erfordert keine ORDER 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.

  1. 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 im dbo-Schema erstellt, in der die Spalte Row_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
    
  2. 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;
    
  3. 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 mit 1.

    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 Spalte Row_ID werden berechnet, indem die Variable @MaxID Werten hinzugefügt wird, die von der Funktion ROW_NUMBER zurückgegeben werden. Die Funktion muss über eine ORDER BY-Klausel verfügen, die die logische Reihenfolge der Zeilen innerhalb des Resultsets definiert. Wenn sie jedoch auf SELECT NULL gesetzt ist, wird keine logische Reihenfolge vorgeschrieben, d. h. Bezeichnerwerte werden willkürlich zugewiesen. Diese ORDER 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];