2009-12-02 40 views
55

如果您有一個varchar字段,您可以輕鬆地執行SELECT * FROM TABLE WHERE ColumnA LIKE '%Test%'以查看該列是否包含某個字符串。在SQL Server上使用LIKE語句XML數據類型

你如何做到這一點的XML類型?

我有這隻會返回一個「文本」節點行下面,但我需要那個節點

select * from WebPageContent where data.exist('/PageContent/Text') = 1 
+2

可能重複的字符作爲XML在Sql服務器?](http://stackoverflow.com/questions/52945/best-way-to-search-data-stored-as-xml-in-sql-server) –

回答

53

內進行搜索,您應該能夠做到這一點很容易:

SELECT * 
FROM WebPageContent 
WHERE data.value('(/PageContent/Text)[1]', 'varchar(100)') LIKE 'XYZ%' 

.value方法爲您提供實際值,您可以將其定義爲VARCHAR(),然後使用LIKE語句進行檢查。

請注意,這不會非常快。所以,如果你在你的XML某些領域,你需要檢查很多,你可以:

  • 創建一個存儲功能,獲取XML並返回你正在尋找的值作爲VARCHAR()
  • 定義你的桌子上調用該函數一個新的計算領域,並使其持久化的列

有了這個,你會基本上是「提取」的XML的某些部分到計算領域,使其持續,然後你可以非常有效地搜索它(哎喲:你甚至可以指定該字段!)。

馬克

+1

我基本上是一個搜索功能,因此我只想在「文本」節點上搜索XML列,然後返回一個子串以指示搜索已找到匹配項。例如,搜索'你好那裏'而不是返回整個xml列我只是返回一個子字符串,如'該人說你好,並進行...' – Jon

+1

擊敗我5秒。另一種可能性是考慮使用自由文本搜索,如果您的數據是可修改的... – RickNZ

+6

要搜索整個字段:WHERE xmlField.value('。','varchar(max)')LIKE'%FOO%' – jhilden

0

這是使用基於marc_s回答什麼,我要去:

SELECT 
SUBSTRING(DATA.VALUE('(/PAGECONTENT/TEXT)[1]', 'VARCHAR(100)'),PATINDEX('%NORTH%',DATA.VALUE('(/PAGECONTENT/TEXT)[1]', 'VARCHAR(100)')) - 20,999) 

FROM WEBPAGECONTENT 
WHERE COALESCE(PATINDEX('%NORTH%',DATA.VALUE('(/PAGECONTENT/TEXT)[1]', 'VARCHAR(100)')),0) > 0 

回報在哪裏搜索條件存在

+0

需要參數來防止注入? – Jon

+2

BE AWARE:這些XML函數區分大小寫 - DATA.VALUE **不會**工作!它需要**。**值(...)** –

+1

剛剛發現, – Jon

10

另一種選擇是搜索的搜索子字符串將XML轉換爲字符串然後使用LIKE作爲字符串。但是作爲一個計算列不能是你需要用它在另一個WHERE子句的一部分,選擇這樣的:

SELECT * FROM 
    (SELECT *, CONVERT(varchar(MAX), [COLUMNA]) as [XMLDataString] FROM TABLE) x 
WHERE [XMLDataString] like '%Test%' 
23

另一個選擇是投XML作爲nvarchar和然後搜索指定字符串就好像XML是一個nvarchar字段一樣。

SELECT * 
FROM Table 
WHERE CAST(Column as nvarchar(max)) LIKE '%TEST%' 

我喜歡這個解決方案,因爲它很乾淨,容易記憶,很難搞清楚,可以用作where子句的一部分。

編輯:由於懸崖提到它,你可以使用:

...如果爲nvarchar有沒有轉換爲varchar的搜索存儲的數據[最佳方式

+2

同上或nvarchar如果有字符不轉換爲varchar SELECT * 從表 WHERE CAST(列爲nvarchar(max))LIKE'%TEST%' –

+0

[Err] 42000 - [SQL Server]將一個或多個字符從XML轉換爲目標歸類不可能 – digz6666

+0

[Err ] 22018 - [SQL Server]不允許將數據類型xml顯式轉換爲文本。 – digz6666