loading..
Русский    English
19:31
листать

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

Метод value()

Метод value() позволяет извлекать из XML документа содержимое единичного элемента или атрибута с указанием его типа данных.

Если выражение XPath указывает на несколько узлов, то будет возвращено сообщение об ошибке. Например,

  1. SELECT name,
  2. xmlData.value('/albums/album[2]/labels/label[1]/text()', 'varchar(100)')
  3. AS SecondAlbumLabel
  4. FROM dbo.tArtist;

XQuery [dbo.tArtist.xmlData.value()]: 'value()' requires a singleton (or empty sequence), found operand of type 'xdt:untypedAtomic *'

Эта ошибка сообщает, что данное XPath-выражение может вернуть более одной сущности. Например, если бы в исходном XML документе было несколько элементов "albums" или более одного элемента "labels".

Чтобы исправить эту ошибку, замените выражение XPath на одно из следующих:

  •  '/albums[1]/album[2]/labels[1]/label[1]/text()[1]'
  •  '(/albums/album[2]/labels/label/text())[1]'

Результат будет одинаковым:

name           SecondAlbumLabel
Radiohead      Parlophone
Guns N’ Roses  Geffen Records

Ещё один пример с типом данных "time". Допустим, мы хотим получить для каждого исполнителя название первого альбома, первой песни из этого альбома и её длительность.

  1. SELECT name
  2.     , xmlData.value('/albums[1]/album[1]/@title', 'varchar(100)') AS FirstAlbum
  3.     , xmlData.value('/albums[1]/album[1]/song[1]/@title', 'varchar(100)') AS FirstSongTitle
  4.     , xmlData.value('/albums[1]/album[1]/song[1]/@length', 'time(0)') AS FirstSongLength
  5. FROM dbo.tArtist;

name          FirstAlbum         FirstSongTitle          FirstSongLength
Radiohead     The King of Limbs   Bloom                   05:15:00
Guns N' Roses Use Your Illusion I Right Next Door to Hell 03:02:00

К сожалению, поле "FirstSongLength" распозналось в формате чч:мм:сс, тогда как мы уверены, что в XML-документе время записано в формате мм:сс. Чтобы исправить эту ошибку, можно использовать обычный синтаксис T-SQL, а можно воспользоваться XQuery:

  1. SELECT name AS artist
  2.   , xmlData.value('/albums[1]/album[1]/@title', 'varchar(100)') AS FirstAlbum
  3.   , xmlData.value('/albums[1]/album[1]/song[1]/@title', 'varchar(100)') AS FirstSongTitle
  4.   , xmlData.value('concat("00:", /albums[1]/album[1]/song[1]/@length)', 'time(0)')
  5. AS FirstSongLength
  6. FROM dbo.tArtist;

artist          FirstAlbum          FirstSongTitle          FirstSongLength
Radiohead     The King of Limbs   Bloom                   00:05:15
Guns N' Roses Use Your Illusion I Right Next Door to Hell 00:03:02

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/BTC-RNKBRUB/
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.
Rambler's Top100