Поделиться через


Пример. Задание директивы XMLTEXT

Этот пример иллюстрирует, как обращение к данным переполненного столбца осуществляется при помощи директивы XMLTEXT в инструкции SELECT, использующей режим EXPLICIT.

Рассмотрим таблицу Person. Эта таблица имеет столбец Overflow, в котором хранится неиспользуемая часть XML-документа.

CREATE TABLE Person(PersonID varchar(5), PersonName varchar(20), Overflow nvarchar(200))
INSERT INTO Person VALUES ('P1','Joe',N'<SomeTag attr1="data">content</SomeTag>')
INSERT INTO Person VALUES ('P2','Joe',N'<SomeTag attr2="data"/>')
INSERT INTO Person VALUES ('P3','Joe',N'<SomeTag attr3="data" PersonID="P">content</SomeTag>')

Этот запрос извлекает столбцы из таблицы Person. Для столбца Overflow значение AttributeName не задано, но значение directive установлено в XMLTEXT как часть, предоставляющая имя столбца универсальной таблицы.

SELECT 1 as Tag, NULL as parent,
       PersonID as [Parent!1!PersonID],
       PersonName as [Parent!1!PersonName],
       Overflow as [Parent!1!!XMLTEST] -- No AttributeName; XMLTEXT directive
FROM Person
FOR XML EXPLICIT

В результирующем XML-документе:

  • так как значение AttributeName не указано для столбца Overflow, а директива xmltext указана, атрибуты элемента <overflow> добавляются в список атрибутов содержащего его элемента <Parent>;

  • так как атрибут PersonID элемента <xmltext> конфликтует с атрибутом PersonID, извлеченным на том же уровне элемента, атрибут элемента <xmltext> игнорируется, даже если PersonID равен NULL. Обычно атрибут замещает атрибут с тем же именем при переполнении.

Результирующий набор:

<Parent PersonID="P1" PersonName="Joe" attr1="data">content</Parent>
<Parent PersonID="P2" PersonName="Joe" attr2="data"></Parent>
<Parent PersonID="P3" PersonName="Joe" attr3="data">content</Parent>

Если переполненные данные имеют вложенные элементы и указан тот же запрос, вложенные элементы в столбце Overflow добавляются как вложенные элементы содержащего его элемента <Parent>.

Например, можно изменить данные в таблице Person так, чтобы столбец Overflow имел вложенные элементы.

TRUNCATE TABLE Person
INSERT INTO Person VALUES ('P1','Joe',N'<SomeTag attr1="data">content</SomeTag>')
INSERT INTO Person VALUES ('P2','Joe',N'<SomeTag attr2="data"/>')
INSERT INTO Person VALUES ('P3','Joe',N'<SomeTag attr3="data" PersonID="P"><name>PersonName</name></SomeTag>')

Если выполнен тот же запрос, вложенные элементы элемента <xmltext> добавляются как вложенные элементы содержащего его элемента <Parent>:

SELECT 1 as Tag, NULL as parent,
       PersonID as [Parent!1!PersonID],
       PersonName as [Parent!1!PersonName],
       Overflow as [Parent!1!!XMLTEXT] -- no AttributeName, XMLTEXT directive
FROM Person
FOR XML EXPLICIT

Результирующий набор:

<Parent PersonID="P1" PersonName="Joe" attr1="data">content</Parent>
<Parent PersonID="P2" PersonName="Joe" attr2="data"></Parent>
<Parent PersonID="P3" PersonName="Joe" attr3="data">
  <name>PersonName</name>
</Parent>

Если указано значение AttributeName вместе с директивой xmltext, атрибуты элемента <overflow> добавляются как атрибуты вложенных элементов содержащего его элемента <Parent>. Имя, указанное как AttributeName, становится именем вложенного элемента

В этом запросе значение AttributeName, <overflow>, указано вместе с директивой xmltext*:*

SELECT 1 as Tag, NULL as parent,
       PersonID as [Parent!1!PersonID],
       PersonName as [Parent!1!PersonName],
       Overflow as [Parent!1!overflow!XMLTEXT] -- Overflow is AttributeName
                      -- XMLTEXT is a directive
FROM Person
FOR XML EXPLICIT

Результирующий набор:

<Parent PersonID="P1" PersonName="Joe">
  <overflow attr1="data">content</overflow>
</Parent>
<Parent PersonID="P2" PersonName="Joe">
  <overflow attr2="data" />
</Parent>
<Parent PersonID="P3" PersonName="Joe">
  <overflow attr3="data" PersonID="P">
    <name>PersonName</name>
  </overflow>
</Parent>

В этом элементе запроса значение directive задано для атрибута PersonName. Это приводит к тому, что в PersonName добавляется в качестве вложенного элемента содержащего его элемента <Parent>. Атрибуты <xmltext> все так же добавляются к окружению элемента <Parent>. Содержимое элемента <overflow> и вложенные элементы добавляются в начало других вложенных элементов, содержащих их элементов <Parent>.

SELECT 1      as Tag, NULL as parent,
       PersonID   as [Parent!1!PersonID],
       PersonName as [Parent!1!PersonName!element], -- element directive
       Overflow   as [Parent!1!!XMLTEXT]
FROM Person
FOR XML EXPLICIT

Результирующий набор:

<Parent PersonID="P1" attr1="data">content<PersonName>Joe</PersonName>
</Parent>
<Parent PersonID="P2" attr2="data">
  <PersonName>Joe</PersonName>
</Parent>
<Parent PersonID="P3" attr3="data">
  <name>PersonName</name>
  <PersonName>Joe</PersonName>
</Parent>

Если в данных столбца XMLTEXT содержатся атрибуты корневого элемента, эти атрибуты не показываются в XML-схеме данных, а средство синтаксического анализа MSXML не проверяет результирующий фрагмент XML-документа. Например:

SELECT 1 as Tag,
       0 as Parent,
       N'<overflow a="1"/>' as 'overflow!1!!xmltext'
FOR XML EXPLICIT, xmldata

Результат. Обратите внимание на то, что в возвращаемой схеме атрибут переполнения a отсутствует:

<Schema name="Schema2" 
        xmlns="urn:schemas-microsoft-com:xml-data" 
        xmlns:dt="urn:schemas-microsoft-com:datatypes">
  <ElementType name="overflow" content="mixed" model="open">
  </ElementType>
</Schema>
<overflow xmlns="x-schema:#Schema2" a="1">
</overflow> 

См. также

Справочник