Azure 数据工厂 - 从列值执行数学运算
Azure Data Factory - Executing Mathematical Operation from column value
我是 Azure 数据工厂的新手,我到处搜索可以根据需要实施的解决方案,但我没有找到。
我的问题:
我在 Azure 数据库中有一个 table,其中有一列包含数学运算,大约 50 列包含运算变量,最后一列我需要更新数学运算的结果,如下所示:
Example of the table
我想要做的是用数学运算的结果填充“结果”列,包含在“操作”列中,使用表达式中的其他列值。这只是一个例子table,我的实际table有大约50列值,所以我使用“替换”操作不是解决方案。
可能有几种方法可以做到这一点,但我不会使用数据工厂,除非您需要将此 activity 编排为更广泛管道的一部分。由于您可以通过 Azure SQL 数据库方便地进行一些计算,除非您有特殊原因不这样做,否则我会充分利用它。 T-SQL 有动态 SQL 和 EXEC
命令来帮助。使用光标 运行 通过不同的公式列表并动态执行它。一个简化的例子:
DROP TABLE IF EXISTS dbo.formulas;
CREATE TABLE dbo.formulas (
Id INT PRIMARY KEY,
formula VARCHAR(100) NOT NULL,
a INT NOT NULL,
b INT NOT NULL,
c INT NOT NULL,
d INT NOT NULL,
e INT NOT NULL,
--...
result INT
);
-- Set up test data
INSERT INTO dbo.formulas ( Id, formula, a, b, c, d, e )
VALUES
( 1, '(a+b)/d', 1, 20, 2, 3, 1 ),
( 2, '(c+b)*(a+e)', 0, 1, 2, 3, 4 ),
( 3, 'a*(d+e+c)', 7, 10, 6, 2, 1 )
SET NOCOUNT ON
-- Create local fast_forward ( forward-only, read-only ) cursor
-- Get the distinct formulas for the table
DECLARE formulaCursor CURSOR FAST_FORWARD LOCAL FOR
SELECT DISTINCT formula
FROM dbo.formulas
-- Cursor variables
DECLARE @sql NVARCHAR(MAX)
DECLARE @formula NVARCHAR(100)
OPEN formulaCursor
FETCH NEXT FROM formulaCursor INTO @formula
WHILE @@fetch_status = 0
BEGIN
SET @sql = 'UPDATE dbo.formulas
SET result = ' + @formula + '
--OUTPUT inserted.id -- optionally output updated ids
WHERE formula = ''' + @formula + ''';'
PRINT @sql
-- Update each result field for the current formula
EXEC(@sql)
FETCH NEXT FROM formulaCursor INTO @formula
END
CLOSE formulaCursor
DEALLOCATE formulaCursor
GO
SET NOCOUNT OFF
GO
-- Check the results
SELECT *
FROM dbo.formulas;
游标在性能方面名声不佳,但我) 在这里我使用不同的公式列表和 ii) 有时它是唯一的方法。我想不出一个很好的基于集合的方法来做这件事——很高兴得到纠正。 CLR 对您不可用。如果性能对您来说是一个主要问题,您可能需要考虑替代方案;有一个关于类似问题的有趣讨论 。
我的结果:
如果您的数据库是 Azure Synapse Analytics 专用 SQL 池,那么您可以查看 Azure Synapse Notebooks 以获得相同的结果。
我是 Azure 数据工厂的新手,我到处搜索可以根据需要实施的解决方案,但我没有找到。
我的问题: 我在 Azure 数据库中有一个 table,其中有一列包含数学运算,大约 50 列包含运算变量,最后一列我需要更新数学运算的结果,如下所示: Example of the table
我想要做的是用数学运算的结果填充“结果”列,包含在“操作”列中,使用表达式中的其他列值。这只是一个例子table,我的实际table有大约50列值,所以我使用“替换”操作不是解决方案。
可能有几种方法可以做到这一点,但我不会使用数据工厂,除非您需要将此 activity 编排为更广泛管道的一部分。由于您可以通过 Azure SQL 数据库方便地进行一些计算,除非您有特殊原因不这样做,否则我会充分利用它。 T-SQL 有动态 SQL 和 EXEC
命令来帮助。使用光标 运行 通过不同的公式列表并动态执行它。一个简化的例子:
DROP TABLE IF EXISTS dbo.formulas;
CREATE TABLE dbo.formulas (
Id INT PRIMARY KEY,
formula VARCHAR(100) NOT NULL,
a INT NOT NULL,
b INT NOT NULL,
c INT NOT NULL,
d INT NOT NULL,
e INT NOT NULL,
--...
result INT
);
-- Set up test data
INSERT INTO dbo.formulas ( Id, formula, a, b, c, d, e )
VALUES
( 1, '(a+b)/d', 1, 20, 2, 3, 1 ),
( 2, '(c+b)*(a+e)', 0, 1, 2, 3, 4 ),
( 3, 'a*(d+e+c)', 7, 10, 6, 2, 1 )
SET NOCOUNT ON
-- Create local fast_forward ( forward-only, read-only ) cursor
-- Get the distinct formulas for the table
DECLARE formulaCursor CURSOR FAST_FORWARD LOCAL FOR
SELECT DISTINCT formula
FROM dbo.formulas
-- Cursor variables
DECLARE @sql NVARCHAR(MAX)
DECLARE @formula NVARCHAR(100)
OPEN formulaCursor
FETCH NEXT FROM formulaCursor INTO @formula
WHILE @@fetch_status = 0
BEGIN
SET @sql = 'UPDATE dbo.formulas
SET result = ' + @formula + '
--OUTPUT inserted.id -- optionally output updated ids
WHERE formula = ''' + @formula + ''';'
PRINT @sql
-- Update each result field for the current formula
EXEC(@sql)
FETCH NEXT FROM formulaCursor INTO @formula
END
CLOSE formulaCursor
DEALLOCATE formulaCursor
GO
SET NOCOUNT OFF
GO
-- Check the results
SELECT *
FROM dbo.formulas;
游标在性能方面名声不佳,但我) 在这里我使用不同的公式列表和 ii) 有时它是唯一的方法。我想不出一个很好的基于集合的方法来做这件事——很高兴得到纠正。 CLR 对您不可用。如果性能对您来说是一个主要问题,您可能需要考虑替代方案;有一个关于类似问题的有趣讨论
我的结果:
如果您的数据库是 Azure Synapse Analytics 专用 SQL 池,那么您可以查看 Azure Synapse Notebooks 以获得相同的结果。