0

我更改了我的存储过程以使用 Merge,这样我就可以在它们不存在时插入条目,或者在我存在时更新它们。

运行以下脚本后,我可以查看我的表,我是否需要删除合并表或结束它或其他什么?

当我运行选择前 1000 个查询时,它只是挂起。

下面的 SQL 中是否存在会导致此错误的内容?

ALTER PROCEDURE [Suppliers].[ProductPropertyInsert]
@ProductId int
,@PropertyId int
,@PropertyValue nvarchar(50)

AS

BEGIN   
    SET NOCOUNT ON;

    MERGE Suppliers.ProductProperties AS target
    USING (SELECT @ProductId, @PropertyId) AS source (ProdId, PropId)
    ON (target.ProductId = source.ProdId)
    WHEN MATCHED THEN 
        UPDATE SET PropertyValue = @PropertyValue
    WHEN NOT MATCHED THEN    
        INSERT (ProductId, PropertyId, PropertyValue)
        VALUES (@ProductId, @PropertyId, @PropertyValue);

    INSERT INTO Suppliers.ProductProperties (ProductId, PropertyId, PropertyValue)
    VALUES(@ProductId, @PropertyId, @PropertyValue)

END
4

1 回答 1

2

没有使用过 MERGE,但我也想知道它是如何工作的。看起来应该将参数合并到 MERGE 中。遵循MSDN 中的示例 A,看起来您应该能够编写:

MERGE Suppliers.ProductProperties AS target
USING (SELECT @ProductId, @PropertyId, @PropertyValue) AS source (ProdId, PropId, PropVal)
ON (target.ProductId = source.ProdId)
WHEN MATCHED THEN 
    UPDATE SET PropertyValue = source.PropVal
WHEN NOT MATCHED THEN    
    INSERT (ProductId, PropertyId, PropertyValue)
    VALUES (source.ProdId, source.PropId, source.PropVal);

我猜你第一次通过时留下了额外的 INSERT 吗?它不是 MERGE 的一部分。

INSERT INTO Suppliers.ProductProperties (ProductId, PropertyId, PropertyValue)
VALUES(@ProductId, @PropertyId, @PropertyValue)

所以我会省略第二个 INSERT。不过,我看不出您的代码应该锁定 Suppliers.ProductProperties 表的任何原因。这应该为您提供记录计数:

从 Suppliers.ProductProperties 中选择 COUNT(1)

看看这是否有帮助。

于 2013-03-27T18:35:45.643 回答