1

ストアド プロシージャに UPDATE クエリがあり、データが既に入力されているテーブル変数を更新する必要があります。このクエリは、次のコードのように、サブクエリでのテーブル変数の@daysPerEmail.ProductId参照、つまりサブクエリでの参照が原因でエラーが発生しています。のようにテーブル変数のエイリアスを使用しようとしましたUPDATE @daysPerEmail d SET LastEmailDate...が、役に立ちませんでした。

質問: ProductId のテーブル変数列がサブクエリで正しく参照されるようにクエリを書き直すにはどうすればよいですか?

UPDATE @daysPerEmail SET LastEmailDate = (SELECT max(ActionDate) FROM 
        useractionsreport  WHERE ProductId = @daysPerEmail.ProductId 
       and ActionTypeId = @userActionTypeId );

更新 1

これを SSMS で再現するには、次のクエリを使用します。SSMSはエラーを出しますMust declare the scalar variable "@daysPerEmail".

DECLARE @daysPerEmail TABLE (
    VendorId INT,
    DaysPerEmail SMALLINT,
    LastEmailDate DATE,
    ProductId INT 
)

INSERT INTO @daysPerEmail (VendorId, DaysPerEmail, LastEmailDate, ProductId)
    VALUES (10, 5, NULL, 11), (12, 3, NULL, 15), (14, 1, NULL, 22);

UPDATE @daysPerEmail
SET LastEmailDate = (SELECT
    MAX(ActionDate)
FROM UserActionsReport   
WHERE ProductId = @daysPerEmail.ProductId
AND ActionTypeId = 2);

更新 2

パオロの答えは期待通りに機能しましたが、以下のようにクエリを使用した別の簡単な解決策も見つけました。@daysPerEmail テーブル変数の ProductId の列に一意の名前を付けるだけで済みました。名前を、UPDATE クエリに含まれるどのテーブルにも存在しない ProdId に変更しました。その後、サブクエリでテーブル変数を参照する必要はありませんでした。ProdId 列名は、UPDATE クエリで使用されるテーブルの中で @daysPerEmail テーブル変数でのみ検出されるためです。

 DECLARE @daysPerEmail TABLE (
    VendorId INT,
    DaysPerEmail SMALLINT,
    LastEmailDate DATE,
    ProdId INT 
)

INSERT INTO @daysPerEmail (VendorId, DaysPerEmail, LastEmailDate,ProdId)
    VALUES (78, 5, NULL, 2), (78, 3, NULL, 387), (78, 1, NULL, 295);

UPDATE @daysPerEmail
SET LastEmailDate = (SELECT
    MAX(ActionDate)
FROM UserActionsReport   
WHERE ProductId = ProdId
AND ActionTypeId = 2);
4

2 に答える 2

2

join を使用した更新はどうですか?
私の記憶が正しければ、標準に準拠していませんが、以下によって許可されていSQL-Serverます。

UPDATE  X
SET     LastEmailDate = Z.MaxActionDate
FROM    @daysPerEmail AS X
        JOIN (
            SELECT  MAX(Y.ActionDate) AS MaxActionDate
                    , Y.ProductId
            FROM    UserActionsReport AS Y
            WHERE   ActionTypeId = 2
            GROUP BY Y.ProductId
        ) AS Z ON Z.ProductId = X.ProductId;
于 2015-09-02T15:12:37.073 に答える