我使用合并后是否需要删除表?在合并的表i上运行select top 1000查询时出错

时间:2013-03-27 15:26:09

标签: sql sql-server

我改变了我的存储过程以使用Merge,这样如果它们不存在我可以插入entrys或者如果我这样做就更新它们。

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

当我运行选择前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

1 个答案:

答案 0 :(得分:2)

没有使用MERGE,但我想知道它是如何工作的。看起来参数应该合并到MERGE中。在Example A from MSDN之后,看起来您应该能够写下:

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表的任何原因。这应该给你一个记录的计数:

SELECT COUNT(1)FROM Suppliers.ProductProperties

看看这是否有帮助。