Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Сравнить xml поле  [new]
ИльдарSR
Member

Откуда:
Сообщений: 466
Добрый день.

Подскажите, пожалуйста, как можно сравнить xml поле.

Т.е
у меня есть вставку в таблицу, и одно из полей xml
хочу сделать проверку

IF NOT EXISTS(SELECT 1 FROM Table1 WHERE a = @a and b= @b)
begin
.....
end
Где b - xml поле
При компиляции процедуры возникает ошибка

The XML data type cannot be compared or sorted, except when using the IS NULL operator.
Сам файл xml
<Doc Dep="121221212112выфвфывфы паывпавчпвапв" Date="2000-01-01" Code="1223" DepartamentCreatedBy="TEST" />

Заранее благодарен за Ваши ответы.
26 янв 14, 13:05    [15470485]     Ответить | Цитировать Сообщить модератору
 Re: Сравнить xml поле  [new]
ИльдарSR
Member

Откуда:
Сообщений: 466
Не знаю правильно или нет, но вроде сделал следующим образом

CAST(b AS NVARCHAR(MAX)) = CAST(@b AS NVARCHAR(MAX))
26 янв 14, 13:32    [15470546]     Ответить | Цитировать Сообщить модератору
 Re: Сравнить xml поле  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6202
ИльдарSR
Не знаю правильно или нет, но вроде сделал следующим образом

CAST(b AS NVARCHAR(MAX)) = CAST(@b AS NVARCHAR(MAX))

Неправильно - вот на таком примере будет выдано, что xml разные. А они одинаковы:
declare
  @x1 xml=N'<item id="1" name="A"/>',
  @x2 xml=N'<item name="A" id="1"/>';

Если заранее известна структура xml, и она вся разворачивается в выборку, то я бы выборки от каждого xml вычел одну из другой дважды со сменой очередности - если в обоих случаях результаты будут пустыми, то выборки идентичны, и xml тоже идентичны - как-то вот так:
declare
  @x1 xml=N'<item id="1" name="A" dt="2014-01-26T15:39:36.430"/>
            <item id="2" name="B" dt="2014-01-26T16:39:36.430"/>',
  @x2 xml=N'<item dt="2014-01-26T16:39:36.430" name="B" id="2" />
            <item dt="2014-01-26T15:39:36.430" name="A" id="1" />';
;with x1 as (
  select
    t.n.value('@id', 'int') id,
    t.n.value('@name', 'varchar(1)') name,
    t.n.value('@dt','datetime') dt
  from @x1.nodes('/item') t(n)
),x2 as (
  select
    t.n.value('@id', 'int') id,
    t.n.value('@name', 'varchar(1)') name,
    t.n.value('@dt','datetime') dt
  from @x2.nodes('/item') t(n)
), res1 as (
  select count(1) cnt from (
    select id, name, dt from x1
    except
    select id, name, dt from x2
  ) v
), res2 as (
  select count(1) cnt from (
    select id, name, dt from x2
    except
    select id, name, dt from x1
  ) v
)
select
  case when r1.cnt=0 and r2.cnt=0 then 1 else 0 end
from res1 r1
cross join res2 r2

Для общего случая, когда неизвестна структура xml, или он весь не разворачивается в одну выборку, можно сделать как-то вот так: http://beyondrelational.com/modules/2/blogs/28/posts/10306/xquery-lab-25-writing-a-tsql-function-to-compare-two-xml-values-part-1.aspx
26 янв 14, 15:52    [15470857]     Ответить | Цитировать Сообщить модератору
 Re: Сравнить xml поле  [new]
ИльдарSR
Member

Откуда:
Сообщений: 466
Большое спасибо за Ваши ответы, сейчас попробую поэксперементировать.
Еще раз спасибо
26 янв 14, 16:16    [15470913]     Ответить | Цитировать Сообщить модератору
 Re: Сравнить xml поле  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
автор
хочу сделать проверку


Ну так проверяйте, обращаясь к данным в XML, не к полю целиком.
26 янв 14, 16:18    [15470920]     Ответить | Цитировать Сообщить модератору
 Re: Сравнить xml поле  [new]
ИльдарSR
Member

Откуда:
Сообщений: 466
Добрый день.

Чтобы не плодить новых тем, опишусь здесь.
Пытаюсь сделать следующее

Есть вот такой xml файл
<Ord>
<Flags>
<Name ord ="FREE" />
</Flags>
<Pos Id="88010538" Number="1" />
</Ord>

Пытаюсь сделать следующее

select @Xml.value('(/Ord/Flags/"@Name ord")[1]', 'varchar(50)' )
Но появляется вот эта ошибка
XQuery [value()]: Syntax error near '@Item Name', expected a step expression.
пытался сделать [@Name ord] но все равно остается ошибка, подскажите, пожалуйста, как мне ее поправить?

Заранее спасибо за Ваши ответы.
27 янв 14, 15:10    [15475751]     Ответить | Цитировать Сообщить модератору
 Re: Сравнить xml поле  [new]
ИльдарSR
Member

Откуда:
Сообщений: 466
Ошибка конечно же
XQuery [value()]: Syntax error near '@Name ord', expected a step expression.
27 янв 14, 15:12    [15475770]     Ответить | Цитировать Сообщить модератору
 Re: Сравнить xml поле  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
ИльдарSR,

что-то странное вы придумываете:
select @Xml.value('(/Ord/Flags/Name/@ord)[1]', 'varchar(50)')
27 янв 14, 15:14    [15475783]     Ответить | Цитировать Сообщить модератору
 Re: Сравнить xml поле  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
ИльдарSR
Пытаюсь сделать следующее

select @Xml.value('(/Ord/Flags/"@Name ord")[1]', 'varchar(50)' )
Но появляется вот эта ошибка
XQuery [value()]: Syntax error near '@Item Name', expected a step expression
select @Xml.value('(/Ord/Flags/Name/@ord)[1]', 'varchar(50)' )
27 янв 14, 15:15    [15475793]     Ответить | Цитировать Сообщить модератору
 Re: Сравнить xml поле  [new]
ИльдарSR
Member

Откуда:
Сообщений: 466
Огромное спасибо.

Супер, блин с xml что-то плохо у меня((
27 янв 14, 15:16    [15475814]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить