能够在无 FROM UPDATE 子句中引用 CTE 是否是未记录的行为?

问题描述 投票:0回答:1

UPDATE
第一部分的语法已记录如下

UPDATE   
    [ TOP ( expression ) [ PERCENT ] ]   
    { { table_alias | <object> | rowset_function_limited   
         [ WITH ( <Table_Hint_Limited> [ ...n ] ) ]  
      }  
      | @table_variable      
    }  

<object>
定义为

<object> ::=  
{   
    [ server_name . database_name . schema_name .   
    | database_name .[ schema_name ] .   
    | schema_name .  
    ]  
    table_or_view_name}  

此外,

表或视图名称

是要更新行的表或视图的名称。 table_or_view_name 引用的视图必须是可更新的,并且在该视图的 FROM 子句中恰好引用一个基表。有关可更新视图的详细信息,请参阅 CREATE VIEW (Transact-SQL)。

据我所知,上述内容均未提及 CTE。然而,在

UPDATE
之后立即引用 CTE 是完全有效的。 这个答案显示了这个有效的例子

;WITH T AS
(   SELECT  InvoiceNumber, 
            DocTotal, 
            SUM(Sale + VAT) OVER(PARTITION BY InvoiceNumber) AS NewDocTotal
    FROM    PEDI_InvoiceDetail
)
UPDATE  T
SET     DocTotal = NewDocTotal

请注意,

UPDATE
和对 CTE 的引用之间没有任何内容,甚至没有
FROM

我是否遗漏了文档中的某些内容,或者是否能够在

UPDATE
未记录的行为之后立即放置 CTE?

请注意,我不是在谈论更新中的

FROM
子句。我说的是
UPDATE FOO
,其中
FOO
是 CTE。文档中有使用 CTE 的示例,但它们都使用
FROM
子句。

sql-server t-sql common-table-expression dml
1个回答
0
投票

请阅读 Microsoft 的语法约定以更好地了解如何翻译其文档:

[ ](括号)可选语法项。

© www.soinside.com 2019 - 2024. All rights reserved.