Конференция "Базы" » Ms Sql Server 2005 xml.modify [MSSQL]
 
  • NkzAlex © (22.11.11 15:18) [0]
    Есть входящий xml, который в общем виде может быть в трех вариантах, к примеру
    Declare @xml
    1. Set @xml = ‘<root><key>1</key></root>’
    2. Set @xml = ‘<root><key>1</key><info></info></root>’
    3. Set @xml = ‘<root><key>1</key><info>ABCDEF…..</info></root>’
    То есть тэг <info>  может не быть, может быть но не заполненным, может быть и заполнен. В хранимой процедуре необходимо преобразовать входящий xml таким образом,
    что бы тэг <info> был заполнен обязательно, информацией полученной во время выполнения процедуры. Исходя из особенностей реализации xml  в sql server 2005 получаю, что необходимо
    1. В первом случае выполнить команду @xml.modify(‘insert <info>{sql:variable(“@info”)}</info> as last into (/root)[1]’)
    2. Во втором @xml.modify(‘insert text{sql:variable(“@info”)} as last into (/root/info)[1]’)
    3. В третьем @xml.modify(‘replace value of (root/info[1]/text())[1] with sql:variable("@info")’)
    То есть
    declare @xml1 xml
    declare @xml2 xml
    declare @xml3 xml

    Set @xml1 = '<root><key>1</key></root>'
    Set @xml2 = '<root><key>1</key><info></info></root>'
    Set @xml3 = '<root><key>1</key><info>ABCDEF…..</info></root>'

    declare @info varchar(254)
    set @info = 'MDFT..'

    set @xml1.modify('insert <info>{sql:variable("@info")}</info> as last into (/root)[1]')
    set @xml2.modify('insert text{sql:variable("@info")} as last into (/root/info)[1]')
    set @xml3.modify('replace value of (root/info[1]/text())[1] with sql:variable("@info")')

    select @xml1, @xml2, @xml3

    Однако, для того что бы применить нужную команду, нужно еще и проверку @xml.exist(…) не один раз выполнить, то есть в реальном случае, на каждое поле большой кусок кода, а в целом на обработку входящего xml вообще портянка. Решил написать процедуру для проверки присвоения значений, но команда типа
    set @expression1 = '(root/info[1]/text())[1]'
    set @xml3.modify('replace value of {sql:variable("@expression1")} with sql:variable("@info")'), либо
    SET @xml.modify(' insert {sql:variable("@expression1")} as last into {sql:variable("@expression1")}')
    выдает ошибку - XQuery [modify()]: An expression was expected
    Сообственно вопрос, какие еще пути возможны в xml(Transact-Sql) XML DML?
    Дополнительные сборки, библиотеки подключать нельзя, на клиенте эти преобразования тоже нельзя делать.
  • Кщд (24.11.11 12:00) [1]
    1. если <info> есть, удалить;
    2. вставить нужный <info>.
 
Конференция "Базы" » Ms Sql Server 2005 xml.modify [MSSQL]
Есть новые Нет новых   [134431   +10][b:0][p:0]