如何在 SQL 服务器中的 UPDATE 查询的子查询中引用 table 变量
How to reference a table variable in sub-query of an UPDATE query in SQL Server
我在存储过程中有一个 UPDATE 查询,我需要在其中更新一个 table 变量,该变量已经被一些数据填充。此查询(如以下代码所示)由于在子查询中引用 table 变量而出错,即在子查询中引用 @daysPerEmail.ProductId
。我尝试像 UPDATE @daysPerEmail d SET LastEmailDate...
一样为 table 变量使用别名,但它没有帮助。
问题:如何重写查询,以便子查询中正确引用 ProductId 的 table 变量列?
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
Paolo 的回答符合预期,但我还找到了另一个使用查询的简单解决方案,如下所示。我所要做的就是为@daysPerEmail table 变量中的 ProductId 列指定一个唯一名称。我将名称更改为 ProdId,它在 UPDATE 查询中涉及的任何 table 中都不存在。然后我不必在子查询中引用 table 变量,因为 ProdId 列名称仅在 @daysPerEmail table 变量中找到 tables 在 UPDATE 查询中使用。
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);
加入更新怎么样?
如果我没记错的话,它不符合标准,但 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;
使用方括号,例如 [@daysPerEmail] 而不是 @daysPerEmail
这样您就可以将别名与 table 变量一起使用。
我在存储过程中有一个 UPDATE 查询,我需要在其中更新一个 table 变量,该变量已经被一些数据填充。此查询(如以下代码所示)由于在子查询中引用 table 变量而出错,即在子查询中引用 @daysPerEmail.ProductId
。我尝试像 UPDATE @daysPerEmail d SET LastEmailDate...
一样为 table 变量使用别名,但它没有帮助。
问题:如何重写查询,以便子查询中正确引用 ProductId 的 table 变量列?
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
Paolo 的回答符合预期,但我还找到了另一个使用查询的简单解决方案,如下所示。我所要做的就是为@daysPerEmail table 变量中的 ProductId 列指定一个唯一名称。我将名称更改为 ProdId,它在 UPDATE 查询中涉及的任何 table 中都不存在。然后我不必在子查询中引用 table 变量,因为 ProdId 列名称仅在 @daysPerEmail table 变量中找到 tables 在 UPDATE 查询中使用。
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);
加入更新怎么样?
如果我没记错的话,它不符合标准,但 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;
使用方括号,例如 [@daysPerEmail] 而不是 @daysPerEmail
这样您就可以将别名与 table 变量一起使用。