如何在 SQL Server 中的 UPDATE 查询的子查询中引用表变量

Sun*_*nil 1 sql-server table-variable sql-update sql-server-2014

我在存储过程中有一个 UPDATE 查询,其中我需要更新一个已经由一些数据填充的表变量。这个查询,如下面的代码,由于在子查询中引用了表变量,即在子查询中@daysPerEmail.ProductId被引用而给出错误。我尝试为表变量使用别名,如 in UPDATE @daysPerEmail d SET LastEmailDate...,但它没有帮助。

问题:如何重写查询以便在子查询中正确引用 ProductId 的表变量列?

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

更新 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);
Run Code Online (Sandbox Code Playgroud)

更新 2

Paolo 的答案按预期工作,但我还使用如下查询找到了另一个简单的解决方案。我所要做的就是为@daysPerEmail 表变量中的 ProductId 列指定一个唯一名称。我将名称更改为 ProdId,它不存在于 UPDATE 查询中涉及的任何表中。然后我不必在子查询中引用表变量,因为 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);
Run Code Online (Sandbox Code Playgroud)

小智 5

使用方括号,例如[@daysPerEmail]而不是@daysPerEmail

这样您就可以将别名与表变量一起使用。