簡體   English   中英

從SQL Server表查詢XML數據

[英]Querying XML data from a SQL Server table

我已經嘗試了與該主題相關的SO線程的所有建議,但仍然沒有得到我所需要的。 我有一個名為SC的XML列。 這在SQL Server 2014上(以防萬一)。 表中只有一行,並且SC列中的XML數據包含以下代碼段...

<SC_ROOT>
  <COMPONENTS>
    <COMPONENT>
      <NAME>Status A Detection</NAME>
      <PROPERTIES>
        <COMP_ENABLED>True</COMP_ENABLED>
      </PROPERTIES>
    </COMPONENT>
    ...
  </COMPONENTS>
</SC_ROOT>

<COMP_ENABLED><NAME>包含“檢測”的那些項返回帶有<NAME><COMP_ENABLED>的表。 如果已經有一個很好的例子,請指出嗎? 提前致謝!

嘗試這個:

SELECT
    Name = xc.value('(NAME)[1]', 'varchar(50)'),
    CompEnabled = xc.value('(PROPERTIES/COMP_ENABLED)[1]', 'varchar(10)')
FROM 
    dbo.YourTable
CROSS APPLY
    SC.nodes('/SC_ROOT/COMPONENTS/COMPONENT') AS XT(XC)
WHERE
    xc.value('(NAME)[1]', 'varchar(50)') LIKE '%Detection'

.nodes()調用.nodes()返回一個具有表別名XT的“虛擬表”,該表別名具有一列(別名XC ),其中包含與XPath表達式相對應的XML片段-基本上是<COMPONENT> XML片段。 您可以深入提取所需的詳細信息

更新:如果您的XML如下所示:

<COMPONENT>
  <NAME>Status A Detection</NAME>
  <PROPERTIES NAME="COMP_ENABLED" VALUE="True" />
</COMPONENT>

然后使用以下代碼獲取結果:

SELECT
    Name = xc.value('(NAME)[1]', 'varchar(50)'),
    CompEnabled = xc.value('(PROPERTIES[@NAME="COMP_ENABLED"]/@VALUE)[1]', 'varchar(10)')
FROM 
    dbo.YourTable
CROSS APPLY
    SC.nodes('/SC_ROOT/COMPONENTS/COMPONENT') AS XT(XC)
WHERE
    xc.value('(NAME)[1]', 'varchar(50)') LIKE '%Detection'

因此,假設COMPONENT可以重復,並且您只想選擇NAME LIKE '%Detection%'COMPONENT節點,則應該可以進行以下操作:

DECLARE @xml xml = '<SC_ROOT>
  <COMPONENTS>
    <COMPONENT>
      <NAME>Status A Detection</NAME>
      <PROPERTIES>
        <COMP_ENABLED>True</COMP_ENABLED>
      </PROPERTIES>
    </COMPONENT>  
    <COMPONENT>
      <NAME>Status B Other</NAME>
      <PROPERTIES>
        <COMP_ENABLED>True</COMP_ENABLED>
      </PROPERTIES>
    </COMPONENT>  
    <COMPONENT>
      <NAME>Status C Detection</NAME>
      <PROPERTIES>
        <COMP_ENABLED>True</COMP_ENABLED>
      </PROPERTIES>
    </COMPONENT>    
  </COMPONENTS>
</SC_ROOT>'

SELECT X.Component.query('.')
FROM @xml.nodes('/SC_ROOT/COMPONENTS/COMPONENT') as X(Component)
WHERE CAST(x.Component.query('NAME/text()') AS NVARCHAR(100)) LIKE '%Detection%'

輸出:

<COMPONENT><NAME>Status A Detection</NAME><PROPERTIES><COMP_ENABLED>True</COMP_ENABLED></PROPERTIES></COMPONENT>
<COMPONENT><NAME>Status C Detection</NAME><PROPERTIES><COMP_ENABLED>True</COMP_ENABLED></PROPERTIES></COMPONENT>

這將為您提供原始的XML片段。 如果要將其切細到表中,則必須修改所選的列以及SELECT.query() 無論NAME在單個COMPONENT重復多少次,只要至少有一個單詞中有'Detection'字樣,這都將起作用。

如果NAME只能出現一次,或者您只關心第一個實例,那么您也可以這樣做:

SELECT X.Component.query('.')
FROM @xml.nodes('/SC_ROOT/COMPONENTS/COMPONENT[contains(NAME[1], "Detection")]') as X(Component)

這將給出相同的輸出。

暫無
暫無

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

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