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.
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 dedbo
, donde la columnaRow_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 );
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ónNEWID()
. 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 columnaRow_ID
se calculan convirtiendo los valores devueltos por la funciónnewid()
. La función no requiere una cláusulaORDER 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.
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 dedbo
, donde la columnaRow_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
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;
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 por1
.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 columnaRow_ID
se calculan al sumar la variable@MaxID
a los valores devueltos por la funciónROW_NUMBER
. La función debe tener una cláusulaORDER BY
, que define el orden lógico de las filas dentro del conjunto de resultados. Sin embargo, cuando se establece enSELECT NULL
, no se impone ningún orden lógico, lo que significa que los valores de los identificadores se asignan arbitrariamente. Esta cláusulaORDER 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];