SQL Server - попытка преобразовать столбец в XML не удалась - PullRequest
3 голосов
/ 05 августа 2010

Я в процессе импорта данных из устаревшей базы данных MySQL в SQL Server 2005.

У меня есть одна таблица, которая вызывает у меня горе. Я импортировал его из MySQL, используя связанный сервер и драйвер MySQL ODBC, и в итоге получаю следующее:

Col Name          Datatype  MaxLen
OrderItem_ID       bigint      8
PDM_Structure_ID   int         4
LastModifiedDate   datetime    8
LastModifiedUser   varchar    20
CreationDate       datetime    8
CreationUser       varchar    20
XMLData            text       -1
OrderHeader_ID     bigint      8
Contract_Action    varchar    10
ContractItem       int         4

Мое основное внимание уделяется столбцу XMLData - мне нужно очистить его и сделать так, чтобы я мог преобразовать его в тип данных XML, чтобы использовать на нем XQuery.

Поэтому я установил для таблицы параметр «большие данные вне строки» на 1:

EXEC sp_tableoption 'OrderItem', 'large value types out of row', 1

и затем я преобразую XMLData в VARCHAR(MAX) и выполняю некоторую очистку XML-файла, хранящегося в этом поле. Пока все хорошо.

Но когда я сейчас пытаюсь преобразовать этот столбец в тип данных XML:

ALTER TABLE dbo.OrderItem
   ALTER COLUMN XMLData XML

Я получаю это сообщение здесь:

Сообщение 511, Уровень 16, Состояние 1, Строка 1
Невозможно создать строку размером 8077, которая больше допустимого максимума размер строки 8060. Заявление имеет было прекращено.

, что довольно удивительно, учитывая, что столбцы, кроме XMLData, занимают всего около 90 байтов, и я специально дал указание SQL Server хранить все «большие данные» вне строки ....

Так почему же SQL Server отказывается преобразовывать этот столбец в данные XML ??? Есть идеи?? Мысли ?? Что я могу проверить / изменить в моем подходе ??

Обновление: Я не знаю, что изменилось, но при второй попытке импортировать необработанные данные из MySQL в SQL Server мне удалось успешно преобразовать этот столбец NTEXT -> VARCHAR (MAX) в конце концов к XML ..... странно ..... anyhoo - работает сейчас - спасибо, ребята, за ваш вклад и рекомендации! Высоко ценится!

Ответы [ 2 ]

1 голос
/ 05 августа 2010

Можете ли вы добавить новый столбец типа xml?

Если это так, добавьте новый столбец xml, обновите таблицу, чтобы установить новый столбец, равный столбцу XmlData, а затем удалите столбец XmlData.

Редактировать
У меня есть таблица «TestTable» со столбцом «nvarchar (max)».

 select * from sys.tables where name = 'TestTable'

Это дает результат, содержащий:

 [lob_data_space_id] [text_in_row_limit] [large_value_types_out_of_row]
 1                   0                   0

все же я могу с радостью сохранить 500 тыс. Символов в моем поле nvarchar (max).

Что вы получите, если запросите sys.tables для своей таблицы OrderItems?

Если ваш [text_in_row_limit] не равен нулю, попробуйте это, что должно преобразовать любые существующие строки в BLOB:

exec sp_tableoption 'OrderItems', 'text in row', 0

, а затем попробуйте переключиться с nvarchar (max) на xml.

от BOL,

Отключение опции текста в строке или уменьшение лимита опции будет требовать преобразования всех BLOB-объектов; следовательно, процесс может быть долгим, в зависимости от количества BLOB строки, которые должны быть преобразованы. таблица заблокирована во время преобразования процесс.

1 голос
/ 05 августа 2010

Если у вас достаточно места для хранения, вы можете попробовать выбрать из VARCHAR(MAX) версии таблицы новую таблицу с той же схемой, но с XMLData, настроенной как XML - либо с использованием SELECT INTO, либо с помощью явного создания стол перед тем, как начать.

PS - это побочная проблема, не связанная с вашей проблемой, но вы можете проверить, не теряете ли вы символы Unicode в исходном поле MySQL XMLData при таком преобразовании, поскольку типы данных text / varchar их не поддерживают.

...