Поделиться через


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

Есть несколько способов передачи XML-данных из SQL Server 2000 в SQL Server 2005 или SQL Server 2008. Например.

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

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

  • Если в базе данных SQL Server 2000 данные хранятся в реляционных столбцах, необходимо создать новую таблицу со столбцом [n]text и, возможно, со столбцом первичного ключа для идентификации строк. Чтобы получить 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_CLOB) 
 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 … '