Ошибка пакета импорта - невозможно преобразовать между типом данных Unicode и Non Unicode String

Я сделал пакет dtsx на своем компьютере с использованием SQL Server 2008. Он импортирует данные из файла csv с разделителями с запятой в таблицу, где все типы полей являются NVARCHAR MAX.

Он работает на моем компьютере, но он должен запускаться на сервере клиентов. Всякий раз, когда они создают один и тот же пакет с одним и тем же CSV файлом и таблицей назначения, они получают ошибку выше.

Мы шаг за шагом создали пакет, и все кажется ОК. Все сопоставления верны, но когда они запускают пакет на последнем шаге, они получают эту ошибку. Они используют SQL Server 2005.

Кто-нибудь может посоветовать, с чего начать эту проблему?

Ответ 1

Проблема преобразования из любого источника не Unicode в таблицу Unicode SQL Server может быть решена с помощью:

  • добавьте шаг преобразования преобразования данных в поток данных
  • откройте "Преобразование данных" и выберите "Юникод" для каждого используемого типа данных.
  • обратите внимание на выходной псевдоним каждого применимого столбца (по умолчанию они называются Копировать [имя исходного столбца])
  • Теперь на шаге "Место назначения" нажмите "Сопоставление"
  • измените все ваши сопоставления ввода, исходящие из столбцов с псевдонимом на предыдущем шаге (это шаг, который легко упускать из виду и оставит вас в недоумении, почему вы все равно получаете те же ошибки).

Ответ 2

В какой-то момент вы пытаетесь преобразовать столбец nvarchar в столбец varchar (или наоборот).

Более того, почему все (предположительно) nvarchar(max)? Это запах кода, если я когда-либо видел его. Знаете ли вы, как SQL Server хранит эти столбцы? Они используют указатели, где столбец хранится из фактических строк, так как они не помещаются в пределах 8k страниц.

Ответ 3

Строковые типы данных, не относящиеся к Unicode:
Используйте STR для текстового файла и VARCHAR для столбцов SQL Server.

Строковые типы Unicode:
Используйте W_STR для текстового файла и столбцы NVARCHAR для SQL Server.

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

Ответ 4

два решения: 1- если тип целевого столбца [nvarchar], он должен быть изменен на [varchar]

2- Добавить компонент "Drived Column" в пакет SSIS и добавить новый столбец со следующим выражением:
(DT_WSTR, "длина" ) [ColumnName]

length - длина столбца в целевой таблице, а ColumnName - это имя столбца в целевой таблице. наконец, в части отображения вы должны использовать этот новый добавленный столбец вместо исходного столбца.

Ответ 5

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

Вместо использования своих компонентов вы можете преобразовать данные в свой запрос

Вместо того, чтобы делать

SELECT myField = myNvarchar20Field
FROM myTable

Вы могли бы сделать

SELECT myField = CONVERT(VARCHAR(20),myNvarchar20Field)
FROM myTable

Ответ 6

Майк, у меня была такая же проблема с SSIS в SQL Server 2005... По-видимому, объект DataFlowDestination всегда будет пытаться проверить данные, поступающие, в Юникод. Перейдите к этому объекту, в окне "Расширенный редактор", "Свойства компонентов", измените свойство "ValidateExternalMetaData" на False. Теперь перейдите на панель "Свойства ввода и вывода", "Вход для входа", "Внешние столбцы" - установите каждый столбец "Тип данных" и "Длина" в соответствии с таблицей базы данных. Теперь, когда вы закрываете этот редактор, эти изменения столбцов будут сохранены и не проверены, и он будет работать.

Ответ 7

Следуйте приведенным ниже инструкциям, чтобы избежать (не удается преобразовать типы строк в unicode и не-Unicode). Эта ошибка

i) Добавьте инструмент преобразования преобразования данных в свой DataFlow.
ii) Чтобы открыть DataFlow Conversion и выберите тип данных [string DT_STR].
iii) Затем перейдите в поток "Назначение", выберите "Отображение".
iv) измените ваше имя i/p на копию имени.

Ответ 8

Это решение, использующее IDE для исправления:

  • Добавьте элемент Data Conversion в поток данных, как показано ниже;

введите описание изображения здесь

  1. Дважды щелкните элемент Data Conversion и установите его, как показано:

введите описание изображения здесь

  1. Теперь дважды щелкните элемент DB Destination, нажмите Mapping и убедитесь, что ваш входной столбец на самом деле тот же, что и при копировании [имя столбца], который на самом деле вывод Data Conversion NOT the DB Source Output (будьте осторожны). Вот скриншот:

введите описание изображения здесь

И вот оно.. сохранить и запустить..

Ответ 9

Получить в реестр конфигурацию клиента и изменить LANG. Для Oracle перейдите в HLM\SOFTWARE\ORACLE\KEY_ORACLIENT... HOME\NLS_LANG и перейдите на соответствующий язык.

Ответ 10

Задача преобразования данных dts - это выбор времени, если есть 50 плюс столбцы! Найдено исправление для этого по ссылке ниже

http://rdc.codeplex.com/releases/view/48420

Однако, похоже, он не работает для версий выше 2008 года. Так вот как мне пришлось преодолевать проблему.

*Open the .DTSX file on Notepad++. Choose language as XML
*Goto the <DTS:FlatFileColumns> tag. Select all items within this tag
*Find the string **DTS:DataType="129"**  replace with **DTS:DataType="130"**
*Save the .DTSX file. 
*Open the project again on Visual Studio BIDS
*Double Click on the Source Task . You would get the message

the metadata of the following output columns does not match the metadata of the external columns with which the output columns are associated:
...
Do you want to replace the metadata of the output columns with the metadata of the external columns?

 *Now Click Yes. We are done !

Ответ 11

Решено - оригинал спросить:

Я видел это раньше. Самый простой способ исправить (не нужны все эти шаги преобразования данных, поскольку ВСЕ метаданные доступны из исходного соединения):

Удалить назначение OLE DB Source и OLE DB Убедитесь, что Delayed Validation FALSE (вы можете установить его в True позже) Восстановите источник OLE DB своим запросом и т.д. Проверьте в расширенном редакторе, что все типы столбцов выходных данных верны Восстановите свой OLE DB Destination, нарисуйте карту, создайте новую таблицу (или измените ее на существующую), и вы увидите, что SSIS вернул все типы данных (такие же, как и исходные).

Намного проще, чем выше.

Ответ 12

Не уверен, что это все еще проблема, но я нашел это простое решение:

  • Источник DB Ole DB с правой кнопкой мыши
  • Выберите "Изменить"
  • Выберите вкладку "Свойства входа и выхода"
  • В разделе "Входы и выходы" развернуть "Выход источника Ole DB" Внешние столбцы и выходные столбцы
  • В столбцах "Вывод" выберите поле "Нарушение" на правой панели, убедитесь, что свойство "Тип данных" соответствует полю поля в свойствах "Внешние столбцы"

Надеюсь, что это было ясно и легко следовать

Ответ 13

Иногда мы получаем эту ошибку, когда мы выбираем статический символ как поле в исходном запросе/представлении/процедуре и тип данных целевого поля в Юникоде.

Ниже приведена проблема: Я использовал script ниже в источнике

и получил сообщение об ошибке Column "CATEGORY" cannot convert between Unicode and non-Unicode string data types., как показано ниже: сообщение об ошибке

Разрешение: Я попробовал несколько вариантов, но никто не работал у меня. Затем я префикс статического значения с N, чтобы сделать в Юникоде, как показано ниже:

SELECT N'STUDENT DETAIL' CATEGORY, NAME, DATEOFBIRTH FROM STUDENTS
UNION
SELECT N'FACULTY DETAIL' CATEGORY, NAME, DATEOFBIRTH FROM FACULTY

Ответ 14

Если кто-то все еще испытывает эту проблему, я обнаружил, что это связано с различием версий Oracle Client.

Я опубликовал свой полный опыт и решение здесь: fooobar.com/questions/86953/...

Ответ 15

1.add a Data Conversion tool from toolbox
2.Open it,It shows all coloumns from excel ,convert it to desire output. take note of the Output Alias of
each applicable column (they are named Copy Of [original column name] by default)
3.now, in the Destination step, click on Mappings

Ответ 16

Я изменил ValidateExternalMetadata = False для каждой задачи преобразования. Это сработало для меня.