-
Есть входящий 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? Дополнительные сборки, библиотеки подключать нельзя, на клиенте эти преобразования тоже нельзя делать.
-
1. если <info> есть, удалить; 2. вставить нужный <info>.
|