我正在嘗試在 SQL Server 中決議下面的 XML 并處理下面的節點:
<PrebillMarkup xmlns="clr-namespace:Xyz.Query.ViewModels;assembly=Xyz.Query" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<PrebillMarkup.NewValues>
<x:String x:Key="Narrative">Calls with P.</x:String>
</PrebillMarkup.NewValues>
<PrebillMarkup.OriginalValues>
<x:String x:Key="Narrative">Calls with P on confi agreement.</x:String>
</PrebillMarkup.OriginalValues>
</PrebillMarkup>
我所有的研究中還沒有任何 SQL,因為我似乎找不到任何與我試圖決議的名稱相近的名稱空間。預期輸出是:
Original Values | New Values
_________________________________________________
Call with P | Calls with P on confi agreement
uj5u.com熱心網友回復:
您需要with xmlnamespaces對查詢進行宣告。例如
declare @doc xml = '
<PrebillMarkup xmlns="clr-namespace:Xyz.Query.ViewModels;assembly=Xyz.Query" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<PrebillMarkup.NewValues>
<x:String x:Key="Narrative">Calls with P.</x:String>
</PrebillMarkup.NewValues>
<PrebillMarkup.OriginalValues>
<x:String x:Key="Narrative">Calls with P on confi agreement.</x:String>
</PrebillMarkup.OriginalValues>
</PrebillMarkup>
';
with xmlnamespaces ('http://schemas.microsoft.com/winfx/2006/xaml' as x,
default 'clr-namespace:Xyz.Query.ViewModels;assembly=Xyz.Query')
select @doc.value('(/PrebillMarkup/PrebillMarkup.OriginalValues/x:String)[1]','nvarchar(50)') [Original Values],
@doc.value('(/PrebillMarkup/PrebillMarkup.NewValues/x:String)[1]','nvarchar(50)') [New Values]
輸出
Original Values New Values
-------------------------------------------------- --------------------------------------------------
Calls with P on confi agreement. Calls with P.
(1 row affected)
按照慣例,您將 xmlnamespace 別名與 xml 檔案中使用的名稱空間別名相匹配,但這在技術上不是必需的。這也有效:
with xmlnamespaces ('http://schemas.microsoft.com/winfx/2006/xaml' as foo,
'clr-namespace:Xyz.Query.ViewModels;assembly=Xyz.Query' as bar)
select @doc.value('(/bar:PrebillMarkup/bar:PrebillMarkup.OriginalValues/foo:String)[1]','nvarchar(50)') [Original Values],
@doc.value('(/bar:PrebillMarkup/bar:PrebillMarkup.NewValues/foo:String)[1]','nvarchar(50)') [New Values]
uj5u.com熱心網友回復:
它與@DavidBrowne-Microsoft 解決方案非常相似,只是性能優化。
查詢陳述句
DECLARE @xml XML =
N'<PrebillMarkup xmlns="clr-namespace:Xyz.Query.ViewModels;assembly=Xyz.Query" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<PrebillMarkup.NewValues>
<x:String x:Key="Narrative">Calls with P.</x:String>
</PrebillMarkup.NewValues>
<PrebillMarkup.OriginalValues>
<x:String x:Key="Narrative">Calls with P on confi agreement.</x:String>
</PrebillMarkup.OriginalValues>
</PrebillMarkup>';
WITH XMLNAMESPACES(DEFAULT 'clr-namespace:Xyz.Query.ViewModels;assembly=Xyz.Query'
, 'http://schemas.microsoft.com/winfx/2006/xaml' AS x)
SELECT c.value('(PrebillMarkup.NewValues/x:String/text())[1]', 'VARCHAR(100)') AS [Original Values]
, c.value('(PrebillMarkup.OriginalValues/x:String/text())[1]', 'VARCHAR(100)') AS [New Values]
FROM @xml.nodes('/PrebillMarkup') AS t(c);
輸出
----------------- ----------------------------------
| Original Values | New Values |
----------------- ----------------------------------
| Calls with P. | Calls with P on confi agreement. |
----------------- ----------------------------------
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/384631.html
標籤:sql sql-server xml 查询语句
上一篇:同時從父表和子表中過濾(搜索)
