loading..
Русский    English
04:24
листать

Методы типа данных XML стр. 5

Метод modify()

Метод modify() позволяет изменять значения непосредственно в XML-документе.

Так же, как и другие методы, он требует выражение XPath, чтобы понять, какое значение нужно изменить. Однако, в отличие от других методов, modify() работает с оператором UPDATE (и не работает с оператором SELECT). Также, modify() может работать только с одним значением за раз. В математике и программировании это называется одноэлементным множеством.

Так как не существует никакого ограничения на количество элементов, содержащихся внутри другого элемента, выражение XPath может возвращать много дочерних элементов. Например, если имеется такой XML документ:

<week>

  <day>Monday</day>

  <day>Tuesday</day>

  <day>Wednesday</day>

</week>
выражение XPath /week/day возвращает три элемента, которые не являются одноэлементным множеством:

<day>Monday</day>

<day>Tuesday</day>

<day>Wednesday</day>

Однако, если заменить выражение XPath на (/week/day)[1], то будет возвращён только один элемент "Monday".

<day>Monday</day>

Попробуем получить название первого лейбла альбома "OK Computer" группы "Radiohead".

  1. SELECT xmlData.query('(/albums/album[@title="OK Computer"]/labels/label/text())[1]')
  2. AS FirstLabelText
  3. FROM dbo.tArtist
  4. WHERE name = 'Radiohead';

FirstLabelText
Parlophone

Метод modify() имеет единственной целью изменение значений в XML-документе, что является полезной возможностью. Представьте, что XML-документ уже импортирован на  Язык структурированных запросов) — универсальный компьютерный язык, применяемый для создания, модификации и управления данными в реляционных базах данных. SQL Server, и обнаружилась опечатка или нужно обновить только одно значение. Чтобы не загружать заново уже исправленный XML-документ, можно просто использовать метод modify() и изменить необходимые значения непосредственно в сохранённом XML-документе на SQL Server.

В следующем примере мы поменяем местами названия лейблов альбома "OK Computer" группы "Radiohead". Первый лейбл должен быть заменён на "Capitol", а второй – на "Parlophone".

Метод modify() может быть использован в предложении SET оператора UPDATE по отношению к переменной или столбцу типа данных XML.

  1. UPDATE dbo.tArtist
  2. SET xmlData.MODIFY('replace value of
  3. (/albums/album[@title="OK Computer"]/labels/label/text())[1] with "Capitol"')
  4. WHERE name = 'Radiohead';

  1. UPDATE dbo.tArtist
  2. SET xmlData.MODIFY('replace value of
  3. (/albums/album[@title="OK Computer"]/labels/label/text())[2] with "Parlophone"')
  4. WHERE name = 'Radiohead';

Отлично – исправленный запрос отработал корректно, что подтверждается сообщениями:

(1 row(s) affected)

(1 row(s) affected)

Теперь вернёмся к исходному запросу (с использованием оператора SELECT) и выполним его, чтобы проверить, что названия лейблов были обновлены корректно.

  1. SELECT xmlData.query('/albums/album[@title="OK Computer"]/labels')
  2. FROM dbo.tArtist
  3. WHERE name = 'Radiohead';

<labels>

  <label>Capitol</label>

  <label>Parlophone</label>

</labels>

Эта задача может быть решена по-другому. Можно поменять местами элементы "label" без изменения их значений. Просто вставим копию первого лейбла в конец списка лейблов.

  1. UPDATE dbo.tArtist
  2. SET xmlData.MODIFY('insert (/albums/album[@title="OK Computer"]/labels/label)[1] as last
  3. into (/albums/album[@title="OK Computer"]/labels)[1]')
  4. WHERE name = 'Radiohead';

После чего удалим первый лейбл.

  1. UPDATE dbo.tArtist
  2. SET xmlData.MODIFY('delete (/albums/album[@title="OK Computer"]/labels/label)[1]')
  3. WHERE name = 'Radiohead';

Чтобы удостовериться, что лейблы поменялись местами корректно, выполним следующий запрос:

  1. SELECT xmlData.query('/albums/album[@title="OK Computer"]/labels')
  2. FROM dbo.tArtist
  3. WHERE name = 'Radiohead';

<labels>

  <label>Parlophone</label>

  <label>Capitol</label>

</labels>

Теперь попробуем отметить песню "Perfect Crime" из альбома "Use Your Illusion I" группы Guns N' Roses, как популярную. Для этого добавим в XML-документ в соответствующий элемент атрибут isPopular со значением 1.

  1. UPDATE dbo.tArtist
  2. SET xmlData.MODIFY('
  3.     insert attribute isPopular { "1" }
  4.     into (/albums[1]/album[@title="Use Your Illusion I"]/song[@title="Perfect Crime"])[1]
  5. ')
  6. WHERE name = 'Guns N'' Roses';

 В качестве ещё одного примера добавим информацию о дате выпуска и дате записи песни "Estranged" из альбома "Use Your Illusion II" группы Guns N' Roses. Обратите внимание, что в данном примере в элемент добавляется сразу два атрибута.

  1. UPDATE dbo.tArtist
  2. SET xmlData.MODIFY('
  3.     insert (
  4.         attribute Recorded { "1991" },
  5.         attribute Released { "1994-01-17" }
  6.     )
  7.     into (/albums[1]/album[@title="Use Your Illusion II"]/song[@title="Estranged"])[1]
  8. ')
  9. WHERE name = 'Guns N'' Roses';

Bookmark and Share
Страницы: 1 2 3 4 5 6
Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE CONSTRAINT Convert COUNT CROSS APPLY CTE DATEADD DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FOREIGN KEY FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INFORMATION_SCHEMA INNER JOIN insert INTERSECT IS NOT NULL IS NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker Больше тэгов
Учебник обновлялся
несколько дней назад
https://exchangesumo.com/obmen/ADVCRUB-NixMoney/
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.
Rambler's Top100