使用傑夫MODEN的CSV分流DelimitedSplit8K
-- Setup table for testing
declare @tbl table
(
RowNo varchar(2),
Type int,
Formula varchar(10),
Amount int
)
-- sample data
insert into @tbl select '01', 0, NULL, 3000
insert into @tbl select '02', 0, NULL, 2000
insert into @tbl select '03', 0, NULL, 1000
insert into @tbl select '04', 1, '01+02-03', NULL
insert into @tbl select '05', 1, '01-02+03', NULL
-- Query
select *
from @tbl t
cross apply
(
select Amt = sum (i.Amount * f.Opr)
from
(
select ItemNumber,
Item = replace(replace(Item, '+', ''), '-', ''),
Opr = case when charindex('-', Item) > 0 then -1 else 1 end
from dbo.DelimitedSplit8K(replace(replace(Formula, '+', ',+'), '-', ',-'), ',')
) f
inner join @tbl i on f.Item = i.RowNo
) a
where t.Type = 1
/* Result :
RowNo Type Formula Amount Amt
----- ----------- ---------- ----------- -----------
04 1 01+02-03 NULL 4000
05 1 01-02+03 NULL 2000
(2 row(s) affected)
*/
這是可悲的_not_一些SQL確實在甚至遠程直接的方式。 –
如果公式對於每一行都是相同的,那麼可以使用窗口函數和LAG(....但是否則您需要使用遊標或客戶端庫 –
@marc_s公式說明'3000 + 2000 - 1000' = 4000如果組件引用了行,請注意減號 –