在 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
我的数据库中有一个名为 '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