簡體   English   中英

使用 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)

Output:

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; 

Output:

Key        Value
---------- ----------
NULL       value1
NULL       value2

正如@Larnu 正確指出的那樣,保留 Microsoft 專有的OPENXML及其伙伴sp_xml_preparedocumentsp_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);

Output

+------------+--------+
|    Key     | Value  |
+------------+--------+
| attribute1 | value1 |
| attribute2 | value2 |
+------------+--------+

參考此鏈接,我找到了如下解決方案:

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; 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM