Ошибка: недопустимый символ XML - PullRequest
1 голос
/ 13 июля 2011

У меня есть столбец с текстовым типом данных, но это поле xml. Когда я пытаюсь выполнить простую инструкцию, такую ​​как

SELECT columnname,
       CONVERT(xml,coloumnname) 
  FROM employee

Это нормально работает в QA, так как имеет небольшой объем данных. Когда я бегу в Prod, то исключение всплывает. Есть ли способ, чтобы он мог обойти все записи, которые имеют недопустимый символ XML, чтобы я мог успешно выполнить код. Использование sql sever 2005 / 2008.

у кого-нибудь есть сценарий для этого?

Ответы [ 2 ]

4 голосов
/ 13 июля 2011

На полном серьезе, вы должны очистить ваши данные.Набор допустимых символов XML указан именно здесь: http://www.w3.org/TR/xml/#charsets.

Наличие любого недопустимого символа в XML - плохая новость.Вместо того, чтобы пытаться «пропустить» эти данные, вам нужно решить корневую проблему, которая является неверными данными.

Можете ли вы написать скрипт для очистки данных в базе данных?

Я полагаю, этоВаше живое приложение может прочитать данные и предварительно обработать их, отыскивая плохие символы перед вызовом CONVERT, но это не решает проблему с корнем и неэффективно.

1 голос
/ 14 июля 2011

Проверка данных на лету достаточно медленная.

  1. Если вы действительно не хотите использовать неверные данные, вам следует добавить столбец в таблицу (например, «Is_Validated»).

  2. Затем запустите скрипт, который проверит данные и, если они преобразуются в xml без исключения, обновит столбец как 1, иначе 0.

  3. Когда вы выполняете свое утверждение, вам следует ограничить конвертацию в xml, где Is_Validated = только 1.

  4. Когда вы вставляете новую строку, проверьте, является ли действительный XML (используя логику TRY / CATCH или CLR) и вставьте только допустимые строки.

  5. Когда ваша логика будет стабильной, вы можете начать проверять свои неверные данные.

Обновление:

Поскольку скрипт из # 2 должен запускаться только один раз, это может быть простой TSQL: Предполагая, что у вас есть первичный ключ Id как int и столбец xml, имя столбца в таблице Employee проверено MySchema

 Declare @id int=0,@xml XML(MySchema)
WHILE EXISTS(SELECT * FROM Employee WHERE Id>@Id)
BEGIN
     SELECT TOP 1 @Id=Id FROM Employee WHERE Id>@Id ORDER BY Id
BEGIN TRY
  SET @xml=(SELECT columnname FROM Employee WHERE id=@Id)
      UPDATE Employee SET Is_Validated=1 WHERE Id=@Id
END TRY
    BEGIN CATCH
        UPDATE Employee SET Is_Validated=0 WHERE Id=@Id
    END CATCH
    END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...