2009-06-01 7 views
0

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

<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. Моя первоначальная мысль состояла в том, чтобы десериализовать это на временную таблицу, обновить таблицу temp с помощью значения переопределения и затем сериализовать ее обратно в XML.

Таким образом, по существу, весь процесс сводится к:

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

Есть ли более элегантный способ в sql server 2005 для выполнения всего этого сс?

ответ

1

Фактический тип данных XML можно изменить с помощью XQuery. См. the modify() method.

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; 
+0

Можете ли вы объяснить, как решение JQuery вписывается в вопрос, который у меня был? Спасибо –

+0

Что такое JQuery? Мой ответ - Transact-SQL. –