Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Применимо к: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>