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 которые находятся в том же утверждении выбора. Вы можете просмотреть код, я разместил некоторые комментарии также для объяснения.

0 ответов

Другие вопросы по тегам