Compartilhar via


Gerar identificadores exclusivos em uma tabela de depósito no Microsoft Fabric

Aplica-se a:✅Depósito no Microsoft Fabric

É um requisito comum em data warehouses atribuir um identificador exclusivo a cada linha de uma tabela. Em ambientes baseados no SQL Server, isso normalmente é feito criando uma coluna de identidade em uma tabela, no entanto, atualmente esse recurso não tem suporte em um warehouse no Microsoft Fabric. Em vez disso, você precisa usar uma técnica de solução alternativa. Apresentamos duas alternativas.

Este artigo descreve técnicas de solução alternativa para gerar identificadores exclusivos em uma tabela de warehouse.

Método 1

Esse método é mais aplicável quando você precisa criar valores de identidade, mas a ordem dos valores não é importante (valores não sequenciais são aceitáveis).

Valores exclusivos são gerados no código que insere dados na tabela.

  1. Para criar dados exclusivos usando esse método, crie uma tabela que inclua uma coluna que armazena valores de identificador exclusivos. O tipo de dados de coluna deve ser definido como bigint. Também deve definir a coluna como NOT NULL, para garantir seja atribuído um identificador para cada linha.

    O exemplo de código T-SQL a seguir cria uma tabela de exemplo chamada Orders_with_Identifier no esquema dbo, em que a coluna Row_ID serve como uma chave exclusiva.

    --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. Quando você insere linhas na tabela, por meio de scripts T-SQL ou código do aplicativo ou de outra forma, gera dados exclusivos para Row_ID com a função NEWID(). Essa função gera um valor exclusivo do tipo uniqueidentifier que pode ser convertido e armazenado como um bigint.

    O código a seguir insere linhas na tabela dbo.Orders_with_Identifier. Os valores da coluna Row_ID são computados convertendo os valores retornados pela função newid(). A função não requer uma cláusula ORDER BY e gera um novo 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

Esse método é mais aplicável quando você precisa criar valores de identidade sequenciais, mas deve ser usado com cuidado em conjuntos de dados maiores, pois pode ser mais lento do que métodos alternativos. Considerações também devem ser feitas para vários processos que inserem dados simultaneamente, pois isso pode levar a valores duplicados.

  1. Para criar dados exclusivos usando esse método, crie uma tabela que inclua uma coluna que armazena valores de identificador exclusivos. O tipo de dados de coluna deve ser definido como int ou bigint, dependendo do volume de dados que você espera armazenar. Também deve definir a coluna como NOT NULL, para garantir seja atribuído um identificador para cada linha.

    O exemplo de código T-SQL a seguir cria uma tabela de exemplo chamada Orders_with_Identifier no esquema dbo, em que a coluna Row_ID serve como uma chave exclusiva.

    --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 inserir linhas na tabela, você precisa determinar o último valor de identificador armazenado na tabela. É possível fazer isso isso recuperando o valor maximum do identificador. Esse valor deve ser atribuído a uma variável para que você possa consultá-la ao inserir linhas da tabela (na próxima etapa).

    O código a seguir atribui o último valor de identificador a uma variável chamada @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. Quando você insere linhas na tabela, números exclusivos e sequenciais são calculados adicionando o valor da variável @MaxID aos valores retornados pela função ROW_NUMBER. Essa função é uma função de janela que calcula um número de linha sequencial começando com 1.

    O código T-SQL a seguir—que é executado no mesmo lote que o script na etapa 2—insere linhas na tabela Orders_with_Identifier. Os valores para a coluna Row_ID são calculados adicionando a variável @MaxID aos valores retornados pela função ROW_NUMBER. A função deve ter uma cláusula ORDER BY, que define a ordem lógica das linhas dentro do conjunto de resultados. No entanto, quando definido como SELECT NULL, nenhuma ordem lógica é imposta, o que significa que os valores do identificador são atribuídos arbitrariamente. Essa cláusula ORDER BY resulta em um tempo de execução mais 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];