从 XMLNode 中选择是不是算作 SQL Server 中的 3 部分命名约定?

Posted

技术标签:

【中文标题】从 XMLNode 中选择是不是算作 SQL Server 中的 3 部分命名约定?【英文标题】:Does Selecting from XMLNodes Count as 3-Part Naming Convention in SQL Server?从 XMLNode 中选择是否算作 SQL Server 中的 3 部分命名约定? 【发布时间】:2021-12-23 08:44:30 【问题描述】:

我最近看到来自@Larnu 的评论,强调列上的 3+ 部分命名将很快(ish)贬值。他的网站上有一篇有用的文章的链接,其中详细说明了这一点:

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 Server 功能页面:

以下 SQL Server 数据库引擎功能受支持 SQL Server 的下一个版本,但将在以后的版本中弃用。 SQL Server的具体版本尚未确定:

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+ 部分命名,您如何做到这一点?

【问题讨论】:

【参考方案1】:

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

例如,你也可以这样做

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 没有被归类为额外的列名。

【讨论】:

感谢您的出色回答。我在选择哪个(你的或@Larnu's 的)作为被接受的那个之间犹豫不决 - 这是我想同时勾选的时候之一!【参考方案2】:

不,3+部分命名是指当您命名对象名称时,例如SchemaName.TableName.ColumnName,上面的情况并非如此。

XMLNodes 是表名,x 是列,但是,valuexml 类型的方法(基本上是函数),而不是对象。因此,您使用 2 部分命名,然后使用 xml 类型的方法扩展,就像您在 FROM 中为 nodes (XMLNodes.x.nodes) 一样。

【讨论】:

感谢您的出色回答。你用通俗易懂的语言表达了我的意思!

以上是关于从 XMLNode 中选择是不是算作 SQL Server 中的 3 部分命名约定?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows Phone 中检查 XMLNode 是不是存在

如何从python中的xmlNode获取xpathContext

xmlnode如何查看节点是不是存在

尝试选择 Word 文档中的所有 XMLNode

XMLNODE:如何在我的 xml 中选择具有属性的此节点

如果Paypal购物车作为网页打开,是不是算作应用内支付?