【发布时间】:2020-07-29 08:11:38
【问题描述】:
对于以下 .nodes() 方法,我需要一个等效的 OPENXML 方法。属性会有所不同,不能硬编码。
DECLARE @Xml XML='<row>
<DeletedVal>
<row attribute1="value1" attribute2="value2"/>
</DeletedVal>
</row>';
SELECT x1.y.value('local-name(.)', 'VARCHAR(30)') AS [Key]
, x1.y.value('.', 'VARCHAR(MAX)') AS [Value]
FROM @Xml.nodes('/row/DeletedVal//@*') x1(y)
输出:
Key Value
------------------------------ ------
attribute1 value1
attribute2 value2
以下 OPENXML 方法需要修复,我不确定如何获取属性。
DECLARE @DocHandle INT
EXEC sp_xml_preparedocument
@DocHandle OUTPUT
, @Xml;
SELECT *
FROM OPENXML (@docHandle, N'/row/DeletedVal//@*')
WITH ([Key] VARCHAR(10) 'key' --- This line needs editing
, [Value] VARCHAR(10) '.')
EXEC Sp_xml_removedocument
@DocHandle;
输出:
Key Value
---------- ----------
NULL value1
NULL value2
【问题讨论】:
-
为什么要使用更旧的功能而不 XQUERY?
-
我不知道 XQUERY 我的服务器也运行 SQL Server 2012。我的 SQL Server 版本是否支持 XQUERY?
-
XQUERY 自 SQL Server 2005 起就受支持(如果我没记错的话),并且是您在第一条语句中使用的。
-
在获取执行计划时,OPENXML 仅占 5%,而 XQUERY(.nodes()) 占 95%。所以 OPENXML 更好吧?
-
较低的数字并不意味着“更好”,不。 XQUERY 是要走的路。旧的
sp_xml_preparedocument更多地保留在 SQL Server 中以实现向后兼容性。
标签: sql-server xml tsql openxml sql-server-openxml