Published on

December 30, 2011

Исследование изменения XML в SQL Server

Добро пожаловать в нашу серию блогов о изменении XML в SQL Server! В этой трехчастной серии мы будем исследовать метод xml modify() и исследовать различные способы обновления содержимого XML-документа. В этой первой части мы начнем с основ и рассмотрим возможность вставки данных в существующий XML-документ.

XML DML (Data Modification Language) – это расширение языка XQuery, которое позволяет выполнять обновления XML-документов на месте. Он обеспечивает большую гибкость, и большинство сценариев можно эффективно обрабатывать с помощью функции modify(). Однако важно отметить, что функцию modify() можно использовать только в составе оператора UPDATE или SET.

Давайте начнем с простого примера XML-документа, который мы будем использовать в течение всей статьи:


  Smith
  John Peter
  
1 Church Lane Littlewood Upper Westshire England

В самой простой форме выражение insert позволяет нам вставлять один или несколько узлов в определенное место внутри XML-документа. Место можно указать с помощью терминов “into”, “after” или “before”. Например, мы можем добавить новый узел <Postcode> в качестве последнего дочернего узла <Address> с помощью термина “as last into”.

SET @XMLData.modify('
insert 
  (3FG 2MP)
  as last into
  (/Person[1]/Address[1])
')

Это приведет к следующему обновленному XML:


  Smith
  John Peter
  
1 Church Lane Littlewood Upper Westshire England 3FG 2MP

Мы также можем использовать термины “after” и “before” для вставки узлов в определенные позиции. Например, мы можем добавить новый узел <DateOfBirth> после узла <Forenames>:

SET @XMLData.modify('
insert 
  (1950-06-01)
  after
  (/Person[1]/Forenames[1])
')

Это приведет к следующему обновленному XML:


  Smith
  John Peter
  1950-06-01
  
1 Church Lane Littlewood Upper Westshire England 3FG 2MP

Аналогично, мы можем использовать термин “before” для вставки узлов перед определенной позицией. Например, мы можем добавить новый узел <Gender> перед недавно добавленным узлом <DateOfBirth>:

SET @XMLData.modify('
insert 
  (Male)
  before
  (/Person[1]/DateOfBirth[1])
')

Это приведет к следующему обновленному XML:


  Smith
  John Peter
  Male
  1950-06-01
  
1 Church Lane Littlewood Upper Westshire England 3FG 2MP

Это всего лишь базовые примеры, но вы можете объединять несколько выражений insert для достижения более сложных изменений. Например, вы можете вставить последовательность узлов, заключив их в скобки и разделив запятыми:

SET @XMLData.modify('
insert 
(
  Male,
  1950-06-01
)
after
(/Person[1]/Forenames[1])
')

Используя выражение insert, мы также можем ссылаться на существующие данные в XML-документе или использовать переменные и столбцы для манипулирования данными. Например, мы можем вставить содержимое переменной или столбца в XML-документ:

DECLARE @Gender VARCHAR(6)
DECLARE @DoB DATETIME
SELECT @Gender = 'Male', @DoB = '1950-06-01'
SET @XMLData.modify('
insert 
(
  { sql:variable("@Gender") },
  { substring(string(sql:variable("@DoB")), 1, 10) }
)
after
(/Person[1]/Forenames[1])
')

Помимо вставки узлов, мы также можем вставлять целые XML-структуры в документ. Например, мы можем вставить предыдущий адрес, сохраненный в переменной:

DECLARE @PreviousAddress XML
SET @PreviousAddress = '

  10 Lakes Lane
  Largehill
  Lower Eastford
  England
'
SET @XMLData.modify('
insert      
  (
    sql:variable("@PreviousAddress")
  )
after
  (/Person[1]/Address[1])
')

Используя условные операторы, такие как if…then…else, мы можем контролировать вставку на основе определенных условий. Например, мы можем вставить новый атрибут с именем YearOfBirth1, если год рождения раньше 1960 года:

SET @XMLData.modify('
insert      
  (
    if (xs:integer(substring(/Person[1]/DateOfBirth[1], 1, 4)) < 1960)
    then
    attribute YearOfBirth1 { substring(/Person[1]/DateOfBirth[1], 1, 4) }
    else
    ()
  )
as last into
  (/Person[1])
')

Это всего лишь несколько примеров того, как выражение insert может использоваться для изменения XML-документов в SQL Server. XML DML обеспечивает большую гибкость и может обрабатывать большинство требований к изменению XML. В следующей части этой серии мы рассмотрим другие аспекты изменения XML, такие как

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.