[英]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.