Загрузка XML-данных
Область применения: SQL Server База данных SQL Azure
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 ... '