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


Пример: Указание директивы XMLTEXT

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

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

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

Этот запрос извлекает столбцы из Person таблицы. Для столбца OverflowИмяАтрибута не указано, но директива установлена на 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>.

  • Так как атрибут в <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 столбец теперь имеет подэлементы.

USE tempdb;  
GO  
TRUNCATE TABLE Person;  
GO  
INSERT INTO Person VALUES   
    ('P1','Joe',N'<SomeTag attr1="data">content</SomeTag>')  
   ,('P2','Joe',N'<SomeTag attr2="data"/>')  
    ,('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>

В этом элементе запроса директива указана для 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 ASParent,  
       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>

См. также

Использование режима EXPLICIT вместе с FOR XML