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 geralmente é feito criando uma coluna de identidade em uma tabela, no entanto, atualmente esse recurso não é suportado em um depósito 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 depósito.
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.
Para criar dados exclusivos usando esse método, crie uma tabela que inclua uma coluna que armazene valores de identificador exclusivo. O tipo de dados da coluna deve ser definido como bigint. Você também deve definir a coluna para
NOT NULL
garantir que cada linha receba um identificador.O exemplo de código T-SQL a seguir cria uma tabela de exemplo nomeada
Orders_with_Identifier
nodbo
esquema, onde aRow_ID
coluna 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 );
Quando você insere linhas na tabela, por meio de scripts T-SQL ou código de aplicativo ou de outra forma, gere dados exclusivos para
Row_ID
com aNEWID()
função. Esta 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
dbo.Orders_with_Identifier
tabela. Os valores para aRow_ID
coluna são calculados convertendo os valores retornadosnewid()
pela função. A função não requer umaORDER BY
cláusula 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. Também devem ser feitas considerações para vários processos que inserem dados simultaneamente, pois isso pode levar a valores duplicados.
Para criar dados exclusivos usando esse método, crie 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 exemplo de código T-SQL a seguir cria uma tabela de exemplo nomeada
Orders_with_Identifier
nodbo
esquema, onde aRow_ID
coluna 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
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;
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 com1
.O código T-SQL a seguir, que é executado no mesmo lote que o script na etapa 2, insere linhas na
Orders_with_Identifier
tabela. Os valores para aRow_ID
coluna são calculados adicionando a@MaxID
variável aos valores retornadosROW_NUMBER
pela função. A função deve ter umaORDER BY
cláusula, que define a ordem lógica das linhas dentro do conjunto de resultados. No entanto, quando definido comoSELECT NULL
, nenhuma ordem lógica é imposta, o que significa que os valores de identificador são atribuídos arbitrariamente. EstaORDER 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];