Compartir vía


Generar identificadores únicos en una tabla de almacén en Microsoft Fabric

Esto se aplica a:✅ Warehouse en Microsoft Fabric

Es un requisito común en los Data Warehouse asignar un identificador único a cada fila de una tabla. En entornos basados en SQL Server, esto se suele hacer con la creación de una columna de identidad en una tabla, sin embargo, esta característica no se admite actualmente en un almacén en Microsoft Fabric. En su lugar, tendrá que usar una técnica de solución alternativa. Presentamos dos alternativas.

En este artículo se describen técnicas alternativas para generar identificadores únicos en una tabla de almacenamiento.

Método 1

Este método es más aplicable cuando necesita crear valores de identidad, pero el orden de los valores no es importante (los valores no secuenciales son aceptables).

Los valores únicos se generan en el código que inserta datos en la tabla.

  1. Para crear datos únicos mediante este método, cree una tabla que incluya una columna que almacene valores de identificador únicos. El tipo de datos de columna debe establecerse en bigint. También debe definir la columna como NOT NULL para asegurarse de que a cada fila se le asigna un identificador.

    En el ejemplo de código T-SQL siguiente se crea una tabla de ejemplo denominada Orders_with_Identifier en el esquema de dbo, donde la columna Row_ID actúa como clave única.

    --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. Al insertar filas en la tabla, a través de scripts de T-SQL o código de aplicación o de otro modo, genere datos únicos para Row_ID con la función NEWID(). Esta función genera un valor único de tipo uniqueidentifier que se puede convertir y almacenar como bigint.

    El código siguiente inserta filas en la tabla dbo.Orders_with_Identifier. Los valores de la columna Row_ID se calculan convirtiendo los valores devueltos por la función newid(). La función no requiere una cláusula ORDER BY y genera un nuevo valor para cada registro.

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

Método 2

Este método es más aplicable cuando necesita crear valores de identidad secuenciales, pero debe usarse con precaución en conjuntos de datos más grandes, ya que puede ser más lento que los métodos alternativos. También se deben tener en cuenta varios procesos que insertan datos simultáneamente, ya que esto podría dar lugar a valores duplicados.

  1. Para crear datos únicos mediante este método, cree una tabla que incluya una columna que almacene valores de identificador únicos. El tipo de datos de la columna debe establecerse como int o bigint, en función del volumen de datos que espere almacenar. También debe definir la columna como NOT NULL para asegurarse de que a cada fila se le asigna un identificador.

    En el ejemplo de código T-SQL siguiente se crea una tabla de ejemplo denominada Orders_with_Identifier en el esquema de dbo, donde la columna Row_ID actúa como clave única.

    --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. Antes de insertar filas en la tabla, es necesario determinar el último valor de identificador almacenado en la tabla. Para ello, recupere el valor máximo del identificador. Este valor se debe asignar a una variable para que pueda consultarlo cuando inserte filas en la tabla (en el paso siguiente).

    El siguiente código asigna el último valor identificador a una variable llamada @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;
    
  3. Al insertar filas en la tabla, los números únicos y secuenciales se calculan sumando el valor de la variable @MaxID a los valores devueltos por la función ROW_NUMBER. Esta función es una función de ventana que calcula un número secuencial de fila empezando por 1.

    El siguiente código T-SQL, que se ejecuta en el mismo lote que el script del paso 2, inserta filas en la tabla Orders_with_Identifier. Los valores de la columna Row_ID se calculan al sumar la variable @MaxID a los valores devueltos por la función ROW_NUMBER. La función debe tener una cláusula ORDER BY, que define el orden lógico de las filas dentro del conjunto de resultados. Sin embargo, cuando se establece en SELECT NULL, no se impone ningún orden lógico, lo que significa que los valores de los identificadores se asignan arbitrariamente. Esta cláusula ORDER BY se traduce en un tiempo de ejecución más rápido.

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