我有以下表连接idProduct = id(一对一):
产品
ProductKeys
我需要在Products表上为单个和批量插入和更新创建一个触发器,根据产品描述更新ProductKeys中的键。
如果产品有密钥,请更新说明的密钥,否则插入新密钥。
产品密钥必须是每个产品的唯一。
因此,如果其他产品的密钥已存在,请将idProduct附加到说明中以创建密钥。
我的问题:
我有触发器用于插入和更新,除了 2个不同的产品被插入或使用相同的描述更新的情况。在这种情况下,两个产品生成的密钥相同。
有什么想法吗?
这是我使用MERGE语句的触发器:
CREATE TRIGGER [dbo].[UpdateKey]
ON [dbo].[Products]
AFTER INSERT, UPDATE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
MERGE ProductKeys [Target]
USING
(
SELECT
CASE
WHEN pk.id IS NULL
THEN i.description
ELSE
i.description + '_' + CAST(i.idProduct AS VARCHAR)
END [NewProductKey]
, i.idProduct
FROM
INSERTED i
LEFT OUTER JOIN ProductKeys pk ON pk.id <> i.idProduct AND pk.ProductKey = i.description
) [source]
ON (target.id = source.idproduct)
WHEN NOT MATCHED THEN
INSERT
(
id
, ProductKey
)
VALUES
(
source.idProduct
, source.NewProductKey
)
WHEN MATCHED THEN
UPDATE SET
ProductKey = source.NewProductKey;
答案 0 :(得分:0)
我在INSERTED上添加了LEFT JOIN以检查源中是否有重复项。我的源查询现在看起来像:
SELECT
CASE
WHEN pk.id IS NULL AND i2.idProduct IS NULL
THEN i.description
ELSE
i.description + '_' + CAST(i.idProduct AS VARCHAR)
END [NewProductKey]
, i.idProduct
FROM
INSERTED i
LEFT OUTER JOIN ProductKeys pk ON pk.id <> i.idProduct AND pk.ProductKey = i.description
LEFT OUTER JOIN INSERTED i2 ON i2.description = i.description AND i.idProduct <> i2.idProduct
这对我来说没问题 - 当源中有2个产品具有相同的描述时,两者都会将其ID附加到密钥上。
但是,如果有一种方法可以让第一个产品的密钥没有id - 只是说明 - 并且其余的都带有id,那将是理想的。