Использовать как заявление о типу данных SQL сервера в XML


Если у вас есть поля varchar, вы можете легко сделать SELECT * FROM TABLE WHERE ColumnA LIKE '%Test%' чтобы увидеть, содержит ли этот столбец определенную строку.

Как это сделать для типа XML?

у меня есть следующие которая возвращает только строки, которые имеют узел "текст", но мне нужно искать в этом узле

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

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

возвращает подстроку в поиске, где существует критерий поиска