在 SQL 服务器中对 upsert(用户定义的 table 类型)实施更多条件?

Implement more conditions on upsert (user defined table types) in SQL Server?

我的数据库中有一个名为 'VendorItemPricing' 的 table。我将 insert/update 定期使用数据 Table 将数据 table 中,换句话说,我将执行批量 insert/update 操作。

下面是我执行此操作的存储过程,效果很好。

假设这是我的 table VendorItemPricing:

ItemPartNumber  VendorName  VendorPrice UpdatedDate                 ObsoleteItem    IsLocked
Z0PD            Apple       1177        2015-05-27 11:11:14.700     0               0
C1GM            Apple       181.25      2015-05-27 11:11:14.700     0               1

每当我向存储过程发送数据table时,它都会检查条件。

假设这是我的输入:

ItemPartNumber => Z0PD
VendorName => Apple

现在,它检查条件。

tableVendor.ItemPartNumber = 'Z0PD' and tableVendor.VendorName = 'Apple' and tableVendor.IsLocked = 0

第一项满足给定条件后将被更新。

现在假设这是我的输入:

ItemPartNumber => ZWEPD
VendorName => Apple

现在,它再次检查条件。

tableVendor.ItemPartNumber = 'ZWEPD' and tableVendor.VendorName = 'Apple' and tableVendor.IsLocked = 0

由于输入数据不符合条件,将插入新行。这个也不错

但是在这种类型的输入中,

ItemPartNumber => C1GM
VendorName => Apple

当它检查条件时。

tableVendor.ItemPartNumber = 'C1GM' and tableVendor.VendorName = 'Apple' and tableVendor.IsLocked = 0

条件现在为假,查询正在插入新行。 :(

它不应该插入该行,因为有一个数据带有这个部件号。如果 IsLocked = 1 的 Item,它既不更新也不插入。

我希望我把我的情况解释清楚了。谁能帮我解决这个错误?

这是我的存储过程。

ALTER PROCEDURE [dbo].[WP_InsertUpdateVendorItemPrices]
    @inputTable InsertUpdateVendorPrices READONLY
AS
BEGIN
    SET NOCOUNT ON;

    MERGE INTO VendorItemPricing tableVendor
    USING @inputTable tableTemp
    ON tableVendor.ItemPartNumber = tableTemp.ItemPartNumber and tableVendor.VendorName = tableTemp.VendorName and tableVendor.IsLocked = 0 
    WHEN MATCHED THEN
    UPDATE SET tableVendor.VendorPrice = tableTemp.VendorPrice, tableVendor.UpdatedDate = GETUTCDATE(), tableVendor.ObsoleteItem = 0
    WHEN NOT MATCHED THEN
    INSERT VALUES(tableTemp.ItemPartNumber, tableTemp.VendorName, tableTemp.VendorPrice, GETUTCDATE(), 0, 0); 
END

我自己得到了答案。谢谢大家。

这是最新更新的工作存储过程。

ALTER PROCEDURE [dbo].[WP_InsertUpdateVendorItemPrices]
      @inputTable InsertUpdateVendorPrices READONLY
AS
BEGIN
    SET NOCOUNT ON;

    MERGE INTO VendorItemPricing tableVendor
    USING @inputTable tableTemp
    ON tableVendor.ItemPartNumber = tableTemp.ItemPartNumber and tableVendor.VendorName = tableTemp.VendorName
    WHEN MATCHED THEN
    UPDATE SET 
        tableVendor.VendorPrice = CASE WHEN tableVendor.IsLocked = 0 THEN tableTemp.VendorPrice ELSE tableVendor.VendorPrice END,
        tableVendor.UpdatedDate = CASE WHEN tableVendor.IsLocked = 0 THEN GETUTCDATE() ELSE tableVendor.UpdatedDate END,
        tableVendor.ObsoleteItem = CASE WHEN tableVendor.IsLocked = 0 THEN 0 ELSE tableVendor.ObsoleteItem END
    WHEN NOT MATCHED THEN
    INSERT VALUES(tableTemp.ItemPartNumber, tableTemp.[VendorName], tableTemp.[VendorPrice], GETUTCDATE(), 0, 0); 
END