使用 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 APPLY
到 UNPIVOT
值 table 创建 MapFrom
和 MapTo
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
我在 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 APPLY
到 UNPIVOT
值 table 创建 MapFrom
和 MapTo
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