ZERGeich
@ZERGeich

Где ошибка в SQL запросе к полю содержащему XML?

Добрый день!
Тыщу лет не практиковался в запросах сложнее простых выборок, а тут пришлось.

Есть MSSQL. Есть база. В базе есть табличка.
В табличке какой-то нехороший тип назвал поле xml типа ntext.
В этом поле, само собой, содержится XML некоей структуры.
Когда я пытаюсь сделать туда запрос с поиском типа:

Select xml
FROM dbo.entity
WHERE xml.value('(/r/authCard)[1]', 'nvarchar(max)') LIKE N'%slip%';


Сервер мне на это закономерно отвечает, что глупости я пишу

Не удалось найти столбец "xml", определяемую пользователем функцию или агрегатную функцию "xml.value". Также возможно, имя является неоднозначным.


Ладно, шут с ним, мы не пальцем деланные - экранируем имя колонки - выдаёт совершенно другую ошибку:
Select xml 
FROM dbo.entity
WHERE 'xml'.value('(/r/authCard)[1]', 'nvarchar(max)') LIKE N'%slip%';


Не удалось вызвать методы для varchar.

Есть подозрение, что где-то ошибка, но где - додуматься не могу.
По мануалам вроде всё корректно.
Подскажите пожалуйста - где я дурак?

UPD:
Попробовал ещё и вот такой вариант из интернетов:
Select cast(xml as nvarchar(max)) as 'Uxml'
FROM dbo.entity
WHERE 'Uxml'.value('(/r/authCard/slip)[1]') LIKE '8A00010056133C01';


Ошибка прежняя: Не удалось вызвать методы для varchar.
  • Вопрос задан
  • 117 просмотров
Решения вопроса 2
@alexalexes
SET QUOTED_IDENTIFIER ON;
-- create
CREATE TABLE entity (
  xml ntext
);

-- insert
INSERT INTO entity(xml) VALUES ('<r><authCard>abc123slip4</authCard><authCard>abc1234</authCard></r>');

-- fetch 
SELECT * FROM entity
where cast(xml as xml).value('(/r/authCard)[1]', 'nvarchar(max)') LIKE N'%slip%';
Ответ написан
rqdkmndh
@rqdkmndh
Web-разработчик
SELECT xml
FROM dbo.entity
WHERE CAST(xml AS XML).value('(//authCard)[1]', 'nvarchar(max)') LIKE N'%slip%';
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы