SQL Server: как вставить в select, с помощью скалярной функции в select caluse
У меня возникли проблемы при вставке данных из оператора select, имеющего скалярный вызов функции. Я разместил образец сценария ниже, и мало комментариев и вопросов в комментариях.
---target table (in my case, this is not table variable, but a regular table, here for simplicity to posted this code as table variable to get the idea)
declare @tblItems table (
Id int identity(1,1)
,ItemID int
,TranNo varchar(20)
,Qty decimal(18,3)
,SomeCalculatedValue decimal(18,3)
)
--a dummay temp table, works like a source table
declare @tblTemp table (
Id int identity(1,1)
,ItemID int
,TranNo varchar(20)
,Qty decimal(18,3)
,SomeCalculatedValue decimal(18,3)
)
--put some dummy data in target table
insert into @tblItems(ItemID, TranNo, Qty, SomeCalculatedValue)
values
(1, 'GRN-001', 10, 0),
(2, 'GRN-002', 20, 0),
(3, 'GRN-003', 15, 0),
(4, 'GRN-004', 32, 0),
(5, 'GRN-005', 18, 0)
;
--insert 3 new rows in temp table, which later I want to insert in target table
insert into @tblTemp(ItemID, TranNo, Qty, SomeCalculatedValue)
values
(1, 'GRN-006', 6, 0), -- this line is working work fine,
(1, 'GRN-007', 3, 0), -- but this line is having problem, because it is not considering the last line( with TranNo='GRN-006' )
(2, 'GRN-008', 8, 0)
--here is the actual work, I need to read data from temp table to target table
--and the key requirement is the column 'SomeCalculatedValue'
--it should call a scalar function, and within that function I have to perform some calculations based on same target table
--for each ItemID passed, that scalar function will works as: it performs some sort of calculations on existing rows
--for that particular ItemID, to simplify the understanding you can think of it as Running-Total(not actually running total, but concept
--is same that each row value will based on previous row value)
insert into @tblItems(ItemID, TranNo, Qty, SomeCalculatedValue)
select
ItemID
,TranNo
,Qty
,[dbo].[GetCalculatedValue] (ItemID, Qty) as SomeCalculatedValue -- this function will perform some calcualations
from @tblTemp
select * from @tblItems
У меня есть две таблицы, @tblItems
а также @tblTemp
, Я должен вставить строки из @tblTemp
в @tblItems
, но в предложении select @tblTemp я использовал скалярную функцию, скажем, GetCalculatedValue(ItemID, Qty)
, который выполняет некоторые расчеты для конкретных ItemID
из целевой таблицы, и для каждой строки вычисляет значение, которое должно быть вставлено в @tblItems
, На самом деле это не Run-Total, но для понимания его можно рассматривать как промежуточный итог, потому что каждое значение строки будет зависеть от последних предыдущих строк.
Так что проблема в том, что когда @tblTemp
имеет более 1 строки для конкретного ItemID
, он должен учитывать уже вставленные строки, но я думаю, что этот оператор вставки в выбор вставит все строки сразу, поэтому он не учитывает последние строки для конкретного ItemID
которые находятся в том же утверждении выбора. Вы можете просмотреть код, я разместил некоторые комментарии также для объяснения.