使用 SQL 评估用户定义的公式(id,列)

Evaluate user define formula (id, column) with SQL

我在 SQL 服务器中有 2 个表,

DECLARE @Formulas TABLE (ID int, Calculation varchar(max)) 

INSERT INTO @Formulas 
VALUES (1, '([445660][SOLDE]+[401000][DEBIT]-[380100][CREDIT])')
DECLARE @Values TABLE (ValueID int, Solde money, Debit money, Credit money)

INSERT INTO @Values 
VALUES (445660, 2500, 5500, 3000),
       (401000, 0, 2500, 0),
       (380100, 0, 0, 3500.24)
DECLARE @SQL varchar(max)=''

SELECT @SQL = @SQL+concat(',(',ID,',',Calculation,')') From @Formulas --Where ID=2

SELECT @SQL = Replace(@SQL,'['+cast(ValueID as varchar(25))+']',/[Value]/) From @Values

SELECT @SQL = 'Select * From ('+Stuff(@SQL,1,1,'values')+') N(ID,Value)'

EXEC(@SQL)

3代码中的/[Value]/必须改为column(Solde, Debit, Credit),因为我有3列,用户可以选择任意一列。

我举个例子 但它是单列的

提前致谢。

也许这会有所帮助。 (认为​​代码看起来很眼熟)

这里我们使用 CROSS APPLYUNPIVOT 值 table 创建 MapFromMapTo

Declare @Formulas table (ID int,Calculation varchar(max)) 
Insert Into @Formulas values
(1,'([445660][SOLDE]+[401000][DEBIT]-[380100][CREDIT])')

Declare @Values table (ValueID int,Solde money,Debit money,Credit money)
Insert Into @Values values
(445660,2500,5500,3000),
(401000,0,2500,0),
(380100,0,0,3500.24)

Declare @SQL varchar(max)=''
Select  @SQL = @SQL+concat(',(',ID,',',Calculation,')') From @Formulas --Where ID=2
Select  @SQL = Replace(@SQL,MapFrom,MapTo) 
  From  @Values A 
  Cross Apply (values ( concat('[',ValueID,'][SOLDE]' ),concat('',Solde))
                     ,( concat('[',ValueID,'][DEBIT]' ),concat('',Debit))
                     ,( concat('[',ValueID,'][CREDIT]'),concat('',Credit))
        ) B(MapFrom,MapTo)
Select  @SQL = 'Select * From ('+Stuff(@SQL,1,1,'values')+') N(ID,Value)'
Exec(@SQL)

结果

ID  Value
1   1499.76