我改变了我的存储过程以使用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
答案 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
看看这是否有帮助。