0

Merge を使用するようにストアド プロシージャを変更しました。エントリが存在しない場合はエントリを挿入し、存在する場合はエントリを更新できます。

次のスクリプトを実行した後、テーブルを表示できます。マージ テーブルを削除するか、終了する必要がありますか?

select top 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)

したがって、2 番目の INSERT は省略します。それでも、コードが Suppliers.ProductProperties テーブルをロックする理由がわかりません。これにより、レコードの数が表示されます。

Suppliers.ProductProperties から COUNT(1) を選択

これが役立つかどうかを確認してください。

于 2013-03-27T18:35:45.643 に答える