Azure 数据工厂 - 从列值执行数学运算

问题描述

我是 Azure 数据工厂的新手,我到处搜索可以根据我的需要实施的解决方案,但我没有找到任何解决方案。

我的问题: 我在 Azure 数据库中有一个表,其中一列包含数学运算,大约 50 列包含运算变量,最后一列需要更新数学运算的结果,如下所示: Example of the table

我想要做的是使用表达式中的其他列值,用包含在“Operation”列中的数学运算的结果填充“result”列。这只是一个示例表,我的实际表大约有 50 列值,因此使用“替换”操作不是我的解决方案。

解决方法

可能有几种方法可以做到这一点,但我不会使用数据工厂,除非您需要将此活动编排为更广泛管道的一部分。由于您可以通过 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)',4 ),( 3,'a*(d+e+c)',7,10,6,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;

游标在性能方面名声不佳,但 i) 在这里我使用不同的公式列表和 ii) 有时这是唯一的方法。我想不出一个很好的基于集合的方法 - 很高兴得到纠正。您无法使用 CLR。如果性能对您来说是一个主要问题,您可能需要考虑替代方案;有一个关于类似问题的有趣讨论 here

我的结果:

My results

如果您的数据库是 Azure Synapse Analytics 专用 SQL 池,那么您可以查看 Azure Synapse Notebooks 以实现相同的结果。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...