Использовать как заявление о типу данных SQL сервера в XML
Если у вас есть поля varchar, вы можете легко сделать SELECT * FROM TABLE WHERE ColumnA LIKE '%Test%'
чтобы увидеть, содержит ли этот столбец определенную строку.
Как это сделать для типа XML?
у меня есть следующие которая возвращает только строки, которые имеют узел "текст", но мне нужно искать в этом узле
select * from WebPageContent where data.exist('/PageContent/Text') = 1
4 ответа:
вы должны быть в состоянии сделать это довольно легко:
SELECT * FROM WebPageContent WHERE data.value('(/PageContent/Text)[1]', 'varchar(100)') LIKE 'XYZ%'
The
.value
метод дает вам фактическое значение, и вы можете определить, что должно быть возвращено как VARCHAR (), который затем можно проверить с помощью оператора LIKE.
- создать хранимую функцию, которая возвращает XML и возвращает значение, которое вы ищете в Тип varchar()
- определите новое вычисляемое поле в таблице, которое вызывает эту функцию, и сделайте его сохраненным столбцом
С этим вы бы в основном "извлекли" определенную часть XML в вычисляемое поле, сделали его сохраненным, а затем вы можете очень эффективно искать на нем (черт: вы даже можете индексировать это поле!).
Марк
еще один вариант-привести XML как nvarchar, а затем искать заданную строку, как если бы XML vas поле nvarchar.
SELECT * FROM Table WHERE CAST(Column as nvarchar(max)) LIKE '%TEST%'
Мне нравится это решение, поскольку оно чистое, легко запоминается, трудно испортить и может использоваться как часть предложения where.
EDIT: как упоминает Клифф, вы можете использовать:
...nvarchar если есть символы, которые не преобразуются в varchar
другой вариант заключается в поиске XML в виде строки путем преобразования его в строку, а затем с помощью LIKE. Однако, поскольку вычисляемый столбец не может быть частью предложения WHERE, вам нужно обернуть его в другой SELECT следующим образом:
SELECT * FROM (SELECT *, CONVERT(varchar(MAX), [COLUMNA]) as [XMLDataString] FROM TABLE) x WHERE [XMLDataString] like '%Test%'
Это то, что я собираюсь использовать на основе 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
возвращает подстроку в поиске, где существует критерий поиска