2009-12-02 39 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