Правила и ограничения массовой загрузки XML (SQLXML 4.0)
Применимо к:База данных SQL ServerAzure SQL
Использование массовой загрузки XML требует понимания следующих рекомендаций и ограничений.
Встроенные схемы не поддерживаются.
Если в исходном XML-документе содержится встроенная схема, при массовой загрузке XML она не учитывается. Для массовой загрузки XML нужно задать схему сопоставления, внешнюю по отношению к XML-данным. Невозможно указать схему сопоставления на узле с помощью атрибута xmlns="x:schema".
Проверяется правильность формата XML-документа, но сам документ не проверяется.
Массовая загрузка XML проверяет XML-документ, чтобы определить, правильно ли он сформирован, то есть, чтобы убедиться, что XML соответствует требованиям к синтаксису, установленным в рекомендации консорциума World Wide Web XML 1.0. Если формат документа содержит ошибки, массовая загрузка XML прекращается и возвращает ошибку. Единственное исключение — когда документ является фрагментом (например, когда у него не один корневой элемент), в этом случае массовая загрузка XML загружает документ.
Массовая загрузка XML не проверяет документ на соответствие какой-либо схеме DTD или XML-Data, которую содержит или на которую ссылается файл XML-данных. Кроме того, массовая загрузка XML-данных не проверяет файл XML-данных на соответствие переданной схеме сопоставления.
Никакая информация из пролога XML-документа не учитывается.
Массовая загрузка XML игнорирует все сведения до и после корневого <> элемента в XML-документе. В частности, массовая загрузка XML не учитывает никаких XML-деклараций, внутренних определений DTD, ссылок на внешние DTD, комментариев и тому подобное.
При наличии схемы сопоставления, задающей связь «первичный ключ — внешний ключ» между двумя таблицами (например, между таблицами Customer и CustOrder), таблица, содержащая первичный ключ, должна описываться в схеме первой. Таблица с внешним ключевым столбцом должна располагаться после нее. Причина этого заключается в том, что порядок, в котором таблицы определяются в схеме, является порядком, используемым для их загрузки в базу данных. Например, следующая схема XDR приведет к ошибке при использовании в массовой загрузке XML, так как <элемент Order> описывается перед элементом <Customer> . Столбец CustomerID в таблице CustOrder представляет собой внешний ключевой столбец, ссылающийся на первичный ключевой столбец CustomerID в таблице Cust.
<?xml version="1.0" ?> <Schema xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:xml:datatypes" xmlns:sql="urn:schemas-microsoft-com:xml-sql" > <ElementType name="Order" sql:relation="CustOrder" > <AttributeType name="OrderID" /> <AttributeType name="CustomerID" /> <attribute type="OrderID" /> <attribute type="CustomerID" /> </ElementType> <ElementType name="CustomerID" dt:type="int" /> <ElementType name="CompanyName" dt:type="string" /> <ElementType name="City" dt:type="string" /> <ElementType name="root" sql:is-constant="1"> <element type="Customers" /> </ElementType> <ElementType name="Customers" sql:relation="Cust" sql:overflow-field="OverflowColumn" > <element type="CustomerID" sql:field="CustomerID" /> <element type="CompanyName" sql:field="CompanyName" /> <element type="City" sql:field="City" /> <element type="Order" > <sql:relationship key-relation="Cust" key="CustomerID" foreign-key="CustomerID" foreign-relation="CustOrder" /> </element> </ElementType> </Schema>
Если в схеме не указаны столбцы переполнения с помощью заметки sql:overflow-field , массовая загрузка XML игнорирует все данные, которые присутствуют в XML-документе, но не описаны в схеме сопоставления.
Массовая загрузка XML применяет заданную схему сопоставления каждый раз, как в потоке XML-данных попадаются известные теги. Данные, которые присутствуют в XML-документе, но не описаны в схеме, пропускаются. Например, предположим, что у вас есть схема сопоставления, описывающая <элемент Customer> . XML-файл данных содержит корневой <тег AllCustomers> (который не описан в схеме), включающий все <элементы Customer> :
<AllCustomers> <Customer>...</Customer> <Customer>...</Customer> ... </AllCustomers>
В этом случае массовая загрузка XML игнорирует <элемент AllCustomers> и начинает сопоставление с элементом <Customer> . Массовая загрузка XML пропускает все элементы, не описанные в схеме, но присутствующие в XML-документе.
Рассмотрим другой файл данных источника XML, содержащий <элементы Order> . Эти элементы не описаны в схеме сопоставления.
<AllCustomers> <Customer>...</Customer> <Order> ... </Order> <Order> ... </Order> ... <Customer>...</Customer> <Order> ... </Order> <Order> ... </Order> ... ... </AllCustomers>
Массовая загрузка XML игнорирует эти <элементы Order> . Но если в схеме используется заметка sql:overflow-field, чтобы определить столбец как столбец переполнения, массовая загрузка XML сохранит все неиспользоваемые данные в этом столбце.
Разделы CDATA и ссылки на сущности для сохранения их в базе данных преобразуются в эквивалентные строки.
В этом примере раздел CDATA заключает в оболочку значение для <элемента City> . Массовая загрузка XML извлекает строковое значение ("NY") перед вставкой <элемента City> в базу данных.
<City><![CDATA[NY]]> </City>
Массовая загрузка XML не сохраняет ссылки на сущности.
Если в схеме сопоставления задано значение по умолчанию для атрибута и в исходных XML-данных этот атрибут отсутствует, при массовой загрузке XML будет использовано значение по умолчанию.
В следующем примере схемы XDR атрибуту HireDate присваивается значение по умолчанию:
<?xml version="1.0" ?> <Schema xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:xml:datatypes" xmlns:sql="urn:schemas-microsoft-com:xml-sql" > <ElementType name="root" sql:is-constant="1"> <element type="Customers" /> </ElementType> <ElementType name="Customers" sql:relation="Cust3" > <AttributeType name="CustomerID" dt:type="int" /> <AttributeType name="HireDate" default="2000-01-01" /> <AttributeType name="Salary" /> <attribute type="CustomerID" sql:field="CustomerID" /> <attribute type="HireDate" sql:field="HireDate" /> <attribute type="Salary" sql:field="Salary" /> </ElementType> </Schema>
В этих XML-данных атрибут HireDate отсутствует во втором <элементе Customers> . Когда массовая загрузка XML вставляет второй <элемент Customers> в базу данных, она использует значение по умолчанию, указанное в схеме.
<ROOT> <Customers CustomerID="1" HireDate="1999-01-01" Salary="10000" /> <Customers CustomerID="2" Salary="10000" /> </ROOT>
Заметка sql:url-encode не поддерживается:
Нельзя задать во вводных XML-данных URL-адрес и ждать, что массовая загрузка XML прочтет данные, находящиеся по этому адресу.
Создаются таблицы, заданные в схеме сопоставления (база данных должна существовать). Если одна или несколько таблиц уже существуют в базе данных, свойство SGDropTables определяет, нужно ли удалять и повторно создавать существующие таблицы.
Если указать свойство SchemaGen (например, SchemaGen = true), создаются таблицы, определенные в схеме сопоставления. Но SchemaGen не создает никаких ограничений (таких как ограничения PRIMARY KEY/FOREIGN KEY) для этих таблиц за одним исключением: если узлы XML, составляющие первичный ключ в связи, определены как имеющие тип ИДЕНТИФИКАТОРа XML (то есть type="xsd:ID" для XSD), а для свойства SGUseID задано значение True для SchemaGen, это не только первичные ключи, созданные из узлов с типизированным идентификатором, но и связи первичного и внешнего ключей создаются из связей схемы сопоставления.
SchemaGen не использует аспекты и расширения схемы XSD для создания реляционной SQL Server схемы.
При указании свойства SchemaGen (например, SchemaGen = true) при массовой загрузке обновляются только указанные таблицы (а не представления с общим именем).
SchemaGen предоставляет только базовые функциональные возможности для создания реляционной схемы из XSD с заметками. При необходимости пользователь должен изменить созданные таблицы вручную.
Если между таблицами существует несколько связей, SchemaGen пытается создать одну связь, которая включает все ключи, задействованные между двумя таблицами. Это ограничение может быть причиной ошибки Transact-SQL.
При массовой загрузке XML-данных в базу по меньшей мере один атрибут или дочерний элемент в схеме сопоставления должен быть сопоставлен со столбцом базы данных.
Если при массовой загрузке XML происходит вставка значений дат, эти значения должны быть заданы в формате (-)CCYY-MM-DD((+-)TZ). Это стандартный формат даты в XSD.
Некоторые флаги свойств несовместимы друг с другом. Например, массовая загрузка не поддерживает Ignoreduplicatekeys=true вместе с Keepidentity=false. Если Keepidentity=false, массовая загрузка ожидает, что сервер создаст значения ключа. В таблицах должно быть ограничение IDENTITY для ключа. Сервер не будет создавать повторяющиеся ключи, что означает, что не нужно, чтобы значения Ignoreduplicatekeys были заданы в значение true. Параметру Ignoreduplicatekey следует присвоить значение true только при отправке значений первичного ключа из входящих данных в таблицу со строками и наличием конфликта значений первичного ключа.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по