XML вопрос в SQL Server - PullRequest
       11

XML вопрос в SQL Server

0 голосов
/ 02 июня 2009

В одном из моих сценариев sql мне нужно выполнить хранимую процедуру со следующей строкой xml

<Collection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Field>
        <Attributes>
            <Attribute Name="CODE1" IsRequired="true" Order="1" IsVisible="true"/>
            <Attribute Name="CODE2" IsRequired="true" Order="2" IsVisible="true"/>
        </Attributes>
        <Rows>
            <Row ProductState="5">
                <Items>
                    <Item Name="PROD1" SendCustomer="false"/>
                    <Item Name="PROD2" SendCustomer="false"/>
                </Items>
            </Row>
        </Rows>
    </Field>
</Collection>

Я получаю информацию Attribute и Item из разных таблиц. Я пишу универсальную функцию, в которой вы передаете идентификатор и возвращаете эту строку XML, которая используется сценарием SQL для выполнения хранимой процедуры

Иногда мне нужно переопределить значения атрибутов некоторых элементов, таких как SendCustomer. Моей первоначальной мыслью было десериализовать это во временную таблицу, обновить временную таблицу значением переопределения и затем сериализовать ее обратно в XML.

Итак, по сути, весь процесс сводится к:

  1. Запрос таблиц, сериализация в XML в функции
  2. Десериализация XML, сохранение во временной таблице
  3. При необходимости изменить значения
  4. Сериализация из таблицы в XML снова

Есть ли в SQL Server 2005 более элегантный способ выполнить весь этот процесс?

1 Ответ

1 голос
/ 02 июня 2009

Тип данных XML фактически может быть изменен с помощью XQuery. См. метод modify () .

declare @x XML;
select @x = N'<Collection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Field>
        <Attributes>
                <Attribute Name="CODE1" IsRequired="true" Order="1" IsVisible="true"/>
                <Attribute Name="CODE2" IsRequired="true" Order="2" IsVisible="true"/>
        </Attributes>
        <Rows>
                <Row ProductState="5">
                        <Items>
                                <Item Name="PROD1" SendCustomer="false"/>
                                <Item Name="PROD2" SendCustomer="false"/>
                        </Items>
                </Row>
        </Rows>
    </Field>
</Collection>';

set @x.modify(N'replace value of 
    (/Collection/Field/Rows/Row/Items/Item[@Name="PROD2"]/@SendCustomer)[1]
    with "true"');

select @x;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...