簡體   English   中英

LIKE在SQL Server XML數據類型中的比較

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

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