[英]LIKE comparison in SQL Server XML datatype
我有一個帶有XML數據類型列的數據庫表。 該列包含如下值:
<NameValuePairCollection>
<NameValuePair Name="Foo" Value="One" />
<NameValuePair Name="Bar" Value="Two" />
<NameValuePair Name="Baz" Value="Three" />
</NameValuePairCollection>
我試圖查詢XML數據類型列的值為"One"
所有行"Foo"
。 我無法創建適當的XQuery來過濾結果。
我找到了一些相關的SO問題,這些問題在我的嘗試中幫助了我,但我仍然無法讓它工作。
如何查詢SQL Server XML列中的值
在SQL Server XML數據類型上使用LIKE語句
這是我到目前為止的SQL:
select *
from MyTable
where [XmlDataColumn].value('((/NameValuePairCollection/NameValuePair)[@Name="Foo"])[@Value]', 'varchar(max)') = 'One'
order by ID desc
這是我現在得到的錯誤:
XQuery [MyTable.XmlDataColumn.value()]: Cannot atomize/apply data() on expression that contains type 'NameValuePair' within inferred type 'element(NameValuePair,#anonymous) *'
更新 (回應@LeoWörteler的建議)
根據您的回答,我將SQL更改為:
select *
from MyTable with(nolock)
where [XmlDataColumn].value('/NameValuePairCollection/NameValuePair[@Name="Subject"]/@Value', 'varchar(max)') = 'One'
order by ID desc
但這仍然無效。 我收到以下錯誤:
XQuery [MyTable.XmlDataColumn.value()]: 'value()' requires a singleton (or empty sequence), found operand of type 'xs:string *'
如果要使用[XmlDataColumn].value(...)
的XPath表達式選擇Value
屬性的Value
而不是整個NameValuePair
元素,則應該可以:
/NameValuePairCollection/NameValuePair[@Name="Foo"]/@Value
您的表達式僅檢查NameValuePair
是否具有屬性Value
。
如果有多個元素具有正確的名稱,並且您想要檢查其中是否有任何值具有值"One"
,則可以使用exist(...)
方法:
where [XmlDataColumn].exist(
'/NameValuePairCollection/NameValuePair[@Name="Subject" and @Value="One"]') = 1
另一種選擇是將XML轉換為varchar,然后搜索給定的字符串,就像XML輸入varchar字段一樣。
SELECT *
FROM Table
WHERE CAST(Column as nvarchar(max)) LIKE '%Name="Foo" Value="One"%'
我喜歡這個解決方案,因為它很干凈,易於記憶,很難搞亂,並且可以用作where子句的一部分。
它不像Leo提供的答案那樣動態和完整,但根據具體情況,它可以是一種“快速”的方式來獲取所需的數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.