Добро пожаловать в нашу серию блогов о изменении 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 = '' SET @XMLData.modify(' insert ( sql:variable("@PreviousAddress") ) after (/Person[1]/Address[1]) ') 10 Lakes Lane Largehill Lower Eastford England
Используя условные операторы, такие как 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, такие как