Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Применимо к:SQL Server
База данных
SQL AzureУправляемый экземпляр
SQL AzureБаза данных SQL в Microsoft Fabric
Этот пример иллюстрирует, как обращение к данным переполненного столбца осуществляется при помощи директивы 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АтрибутName не указан, но директива задана XMLTEXT как часть предоставления имени универсального столбца таблицы.
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;
В результирующем XML-документе:
Так как AttributeName не указан для
Overflowстолбца иxmltextуказана директива, атрибуты в<overflow>элементе добавляются в список атрибутов заключиющего<Parent>элемента.Поскольку атрибут в элементе
PersonIDконфликтует с атрибутом<xmltext>, полученным на том же уровне элемента, атрибут в элементеPersonIDигнорируется, даже если<xmltext>равно 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>
Если АтрибутName указан с 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>