在 SQL 服务器中,从 XMLNodes 中选择是否算作三部分命名约定?

Does Selecting from XMLNodes Count as 3-Part Naming Convention in SQL Server?

我最近看到@Larnu 的评论强调,列上的 3+ 部分命名将很快(差不多)被贬低。他的网站上有一篇有用的文章 link,其中详细说明了这一点:

https://wp.larnu.uk/3-part-naming-on-columns-will-be-deprecated/

具体来说,它引用了 docs.microsoft.com (https://docs.microsoft.com/en-us/sql/database-engine/deprecated-database-engine-features-in-sql-server-2016?view=sql-server-ver15) 上已贬值的 SQL 服务器功能页面:

The following SQL Server Database Engine features are supported in the next version of SQL Server, but will be deprecated in a later version. The specific version of SQL Server has not been determined:

Category Deprecated feature Replacement Feature name Feature ID
Transact-SQL Three-part and four-part column references. Two-part names is the standard-compliant behavior. More than two-part column name 3

我的问题是这是否适用于使用 XMLnodes 作为列引用?例如:

SELECT
    XMLNodes.x.value('@time', 'datetime') as Runtime,
    InnerXMLNode.x.value('@currency', 'varchar(3)') as Currency,
    InnerXMLNode.x.value('@rate', 'Decimal(10,7)') as Rate
from
    @xmlFile.nodes('/Envelope/Cube/Cube') as XMLNodes(x)
    cross apply XMLNodes.x.nodes('Cube') as InnerXMLNode(x)

我找不到任何特别排除 XMLnodes 的东西,但它们在技术上仍然是列吗?如果折旧功能确实包括 XMLnodes,你如何在没有 3+ 部分命名的情况下做到这一点?

不,3+ 部分命名意味着当您命名对象名称时,例如 SchemaName.TableName.ColumnName,上述情况并非如此。

XMLNodes 是 table 名称,x 列,但是,valuexml 类型的方法(基本上是一个函数), 不是一个对象。所以你正在使用 2 部分命名,然后使用 xml 类型的方法扩展,就像你在 FROM for nodes (XMLNodes.x.nodes).

不,不是。它只是在该列上调用一个方法。

比如你也可以做

CAST(SomeValue AS xml).value(.....

显然这不是三部分命名


The official grammar for SELECT如下

<select_list> ::=   
    {   
      *   
      | { table_name | view_name | table_alias }.*   
      | {  
          [ { table_name | view_name | table_alias }. ]  
               { column_name | $IDENTITY | $ROWGUID }   
          | udt_column_name [ { . | :: } { { property_name | field_name }   
            | method_name ( argument [ ,...n] ) } ]  
          | expression  
          [ [ AS ] column_alias ]   
         }  
      | column_alias = expression   
    } [ ,...n ]   

虽然语法不完善,但可以看出udt_column_name.method_name没有被归类为额外的列名。