Partilhar via


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

Aplica-se a: Armazém no Microsoft Fabric

É um requisito comum em armazéns de dados 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, esse recurso não é suportado em um depósito no Microsoft Fabric. Em vez disso, você precisará usar uma técnica de solução alternativa.

Técnica de solução alternativa

Este artigo descreve uma técnica de solução alternativa que gera identificadores exclusivos em uma tabela de depósito.

Etapa 1: Criar uma tabela com uma coluna de identificador

Primeiro, você deve criar uma tabela que inclua uma coluna que armazene valores de identificador exclusivo. O tipo de dados da coluna deve ser definido como int ou bigint, dependendo do volume de dados que você espera armazenar. Você também deve definir a coluna para NOT NULL garantir que cada linha receba um identificador.

O código a seguir cria uma tabela de exemplo nomeada Orders_with_Identifier no dbo esquema.

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

Etapa 2: Determinar o último valor do identificador

Antes de inserir linhas na tabela, você precisa determinar o último valor de identificador armazenado na tabela. Você pode fazer isso recuperando o valor máximo do identificador. Esse valor deve ser atribuído a uma variável para que você possa consultá-la quando inserir linhas da tabela (na próxima etapa).

O código a seguir atribui o último valor 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;

Etapa 3: Inserir valores de identificador exclusivo

Quando você insere linhas na tabela, números exclusivos e sequenciais são calculados adicionando o valor da variável aos valores retornados @MaxID pela função ROW_NUMBER . Esta função é uma função de janela que calcula um número de linha sequencial começando com 1.

O código a seguir, que é executado no mesmo lote que o script na etapa 2, insere linhas na Orders_with_Identifier tabela. Os valores para a Row_ID coluna são calculados adicionando a @MaxID variável aos valores retornados ROW_NUMBER pela função. A função deve ter uma ORDER BY cláusula, 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 de identificador são atribuídos arbitrariamente. Esta ORDER BY cláusula resulta num 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];