Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом примере показано, как данные в столбце переполнения обрабатываются, используя директиву 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>