繁体   English   中英

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

[英]How to reference a table variable in sub-query of an UPDATE query in SQL Server

我在存储过程中有一个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

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);

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

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

那用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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM