Я смотрю на использование хранимой процедуры, чтобы помочь в ситуации, когда мне нужно обновить / вставить около 1000 записей.Мне было предложено использовать MERGE
с табличным параметром для достижения этой цели, но проблема в том, что один из столбцов представляет собой строку JSON.
ItemsTbl
id -PK
BrandId- int (FK)
LocationId- int (FK)
Field3 - nvarchar(Max) Json string containing a jsonKey called itemNumber
select *
from ItemsTbl
where BrandId = 1
and LocationId = 1
and JSON_VALUE('Field3',$.itemNumber) = 12345
Теперь хранимая процедура (что для меня почти все новое) выглядит сейчас так:
/* Create a table type. */
CREATE TYPE SourceTableType AS TABLE
( BrandId INT
, LocationId INT
, ItemNumber INT
, ...
);
GO
CREATE PROCEDURE dbo.usp_InsertTvp
@Source SourceTableType READONLY
AS
MERGE INTO Table1 AS Target
USING @Source As Source ON Target.BrandId = Source.BrandId
AND Target.LocationId = Source.LocationId
AND Target.ItemNumber = Source.ItemNumber
WHEN MATCHED THEN
UPDATE SET OtherParam = Source.OtherParam
WHEN NOT MATCHED BY TARGET THEN
INSERT (BrandId, LocationId, ItemNumber, OtherParam)
VALUES (BrandId, LocationId, ItemNumber, OtherParam) ;
Проблема заключается в том, что в данный момент, похоже, не учитывается, что ItemNumber
находится внутристрока JSON, а не собственный столбец.Так что я не думаю, что это сработает
Target.ItemNumber = Source.ItemNumber
Кроме того, я предполагаю, что SourceTableType
придется принять Field3
в качестве параметра и затем извлечь его самому?