ストアド プロシージャに 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);