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.
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 esquemadbo
, em que a colunaRow_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 );
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çãoNEWID()
. 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 colunaRow_ID
são computados convertendo os valores retornados pela funçãonewid()
. A função não requer uma cláusulaORDER 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.
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 esquemadbo
, em que a colunaRow_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
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;
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 com1
.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 colunaRow_ID
são calculados adicionando a variável@MaxID
aos valores retornados pela funçãoROW_NUMBER
. A função deve ter uma cláusulaORDER BY
, 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 do identificador são atribuídos arbitrariamente. Essa cláusulaORDER 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];