使用 OPENXML 读取 XML 个属性值
Reading XML attribute values using OPENXML
对于下面的 .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
参考这个link,我找到了如下解决方案:
DECLARE @Xml XML='<row><DeletedVal><row attribute1="value1" attribute2="value2"/></DeletedVal></row>';
DECLARE @DocHandle INT
EXEC sp_xml_preparedocument
@DocHandle OUTPUT
, @Xml;
SELECT *
FROM OPENXML (@docHandle, N'/row/DeletedVal//@*')
WITH ([Key] VARCHAR(10) '@mp:localname'
, [Value] VARCHAR(10) '.')
EXEC Sp_xml_removedocument
@DocHandle;
正如@Larnu 正确指出的那样,保留 Microsoft 专有 OPENXML
及其伙伴 sp_xml_preparedocument
和 sp_xml_removedocument
只是为了与过时的 SQL Server 2000 向后兼容。
强烈建议重新编写您的 SQL 并将其切换到 XQuery。从 2005 年开始,它在 MS SQL 服务器中可用。
我通过从 .nodes()
XQuery 方法中删除 //@*
(向下到处搜索后代),对您的 T-SQL 进行了一些性能改进。
DECLARE @Xml XML =
N'<row>
<DeletedVal>
<row attribute1="value1" attribute2="value2"/>
</DeletedVal>
</row>';
SELECT c.value('local-name(.)', 'VARCHAR(30)') AS [Key]
, c.value('.', 'VARCHAR(MAX)') AS [Value]
FROM @Xml.nodes('/row/DeletedVal/row/@*') AS t(c);
输出
+------------+--------+
| Key | Value |
+------------+--------+
| attribute1 | value1 |
| attribute2 | value2 |
+------------+--------+
对于下面的 .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
参考这个link,我找到了如下解决方案:
DECLARE @Xml XML='<row><DeletedVal><row attribute1="value1" attribute2="value2"/></DeletedVal></row>';
DECLARE @DocHandle INT
EXEC sp_xml_preparedocument
@DocHandle OUTPUT
, @Xml;
SELECT *
FROM OPENXML (@docHandle, N'/row/DeletedVal//@*')
WITH ([Key] VARCHAR(10) '@mp:localname'
, [Value] VARCHAR(10) '.')
EXEC Sp_xml_removedocument
@DocHandle;
正如@Larnu 正确指出的那样,保留 Microsoft 专有 OPENXML
及其伙伴 sp_xml_preparedocument
和 sp_xml_removedocument
只是为了与过时的 SQL Server 2000 向后兼容。
强烈建议重新编写您的 SQL 并将其切换到 XQuery。从 2005 年开始,它在 MS SQL 服务器中可用。
我通过从 .nodes()
XQuery 方法中删除 //@*
(向下到处搜索后代),对您的 T-SQL 进行了一些性能改进。
DECLARE @Xml XML =
N'<row>
<DeletedVal>
<row attribute1="value1" attribute2="value2"/>
</DeletedVal>
</row>';
SELECT c.value('local-name(.)', 'VARCHAR(30)') AS [Key]
, c.value('.', 'VARCHAR(MAX)') AS [Value]
FROM @Xml.nodes('/row/DeletedVal/row/@*') AS t(c);
输出
+------------+--------+
| Key | Value |
+------------+--------+
| attribute1 | value1 |
| attribute2 | value2 |
+------------+--------+