在 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
列,但是,value
是 xml
类型的方法(基本上是一个函数), 不是一个对象。所以你正在使用 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
没有被归类为额外的列名。
我最近看到@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
列,但是,value
是 xml
类型的方法(基本上是一个函数), 不是一个对象。所以你正在使用 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
没有被归类为额外的列名。