在无FROM子句的UPDATE中直接引用CTE是否属于未记录行为?
UPDATE直接引用CTE的语法疑问
官方文档对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是要更新行的表或视图名称,且视图必须可更新且仅引用一个基表。
据我了解,上述定义里完全没提到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的FROM子句中使用CTE,而是直接用UPDATE FOO的形式引用名为FOO的CTE——目前文档里的CTE示例都用到了FROM子句。
内容的提问来源于stack exchange,提问作者J. Mini
相关产品推荐
相关产品推荐

