Загрузка XML-данных

Область применения:SQL ServerAzure SQL Database

Xml-данные можно передавать в SQL Server несколькими способами. Например:

  • Если у вас есть данные в столбце [n]text или image в базе данных SQL Server, вы можете импортировать таблицу с помощью служб Integration Services. Изменить тип столбца на XML можно с использованием инструкции ALTER TABLE.

  • Вы можете массово скопировать данные из другой базы данных SQL Server с помощью bcp out, а затем массово вставить данные в базу данных более поздней версии с помощью bcp.

  • Если у вас есть данные в реляционных столбцах в базе данных SQL Server, создайте новую таблицу с текстовым столбцом [n], а также, при необходимости, первичный ключевой столбец для идентификатора строки. Чтобы получить XML-данные, созданные на сервере с помощью инструкции FOR XML, и записать их в столбец [n]text , требуется программный код на клиентской стороне. Затем эти данные необходимо передать в базу данных более поздней версии, выбрав любую из вышеупомянутых методик. XML-данные можно напрямую записать в XML-столбец базы данных более поздней версии.

Массовая загрузка XML-данных

Вы можете массово загружать XML-данные на сервер с помощью возможностей массовой загрузки SQL Server, таких как bcp. Инструкция OPENROWSET позволяет загрузить данные в XML-столбец из файлов. Это показано в следующем примере.

Пример. Загрузка XML из файлов

В этом примере показано, как вставить строку в таблицу T. Значение XML-столбца загружается из файла C:\MyFile\xmlfile.xml в виде CLOB, а целочисленный столбец предоставляется значение 10.

INSERT INTO T
SELECT 10, xCol
FROM    (SELECT *
    FROM OPENROWSET (BULK 'C:\MyFile\xmlfile.xml', SINGLE_BLOB)
AS xCol) AS R(xCol);

Кодировка текста

SQL Server хранит XML-данные в Юникоде (UTF-16). XML-данные, извлекаемые из баз данных сервера, предоставляются в кодировке UTF-16. Если требуются данные в другой кодировке, извлеченные данные нужно преобразовать. Иногда XML-данные могут быть представлены в другой кодировке. Если это так, во время загрузки данных нужно быть внимательным. Например:

  • Если текст XML представлен в кодировке Юникод (UCS-2, UTF-16), можно назначить его XML-столбцу, переменной или параметру без каких-либо проблем.

  • Если кодировка не является Юникодом и неявна из-за исходной кодовой страницы, строка кодовая страница в базе данных должна совпадать с точками кода, которые требуется загрузить. При необходимости используйте COLLATE. Если такой кодовой страницы на сервере не существует, необходимо добавить явную XML-декларацию с корректной кодировкой.

  • Чтобы явно задать кодировку, воспользуйтесь типом varbinary() , который не зависит от кодовых страниц, либо символьным типом для соответствующей кодовой страницы. После этого назначьте данные XML-столбцу, переменной или параметру.

Пример. Явно указать кодировку

Предположим, что у вас есть XML-документ, vcdoc, хранящийся как varchar(max), который не имеет явного объявления XML. Приведенная ниже инструкция добавляет объявление XML с кодировкой "iso8859-1", присоединяет к нему XML-документ, приводит результат к типу varbinary(max) (чтобы сохранить двоичное представление) и, наконец, приводит его к типу XML. Это позволяет процессору XML выполнять синтаксический анализ данных в соответствии с указанной кодировкой «iso8859-1» и создавать для строковых значений соответствующее представление UTF-16.

SELECT CAST(
CAST (('<?xml version="1.0" encoding="iso8859-1"?>'+ vcdoc) AS VARBINARY (MAX))
AS XML);

Несовместимость строковой кодировки

Если вы копируете и вставляете XML в виде строкового литерала в окно редактора запросов в SQL Server Management Studio, может возникнуть ошибка [n]кодировка строки varchar несовместимости. Это будет зависеть от кодировки копируемого экземпляра XML. Во многих случаях может возникнуть необходимость удаления XML-декларации. Например:

<?xml version="1.0" encoding="UTF-8"?>
  <xsd:schema ...

Затем необходимо префиксировать строку с N помощью xml-экземпляра экземпляра Юникода. Например:

-- Assign XML instance to a variable.
DECLARE @X XML
SET @X = N'...'
-- Insert XML instance into an xml type column.
INSERT INTO T VALUES (N'...')
-- Create an XML schema collection
CREATE XML SCHEMA COLLECTION XMLCOLL1 AS N'<xsd:schema ... '

См. также