2017-01-26 6 views
2

Я установил решение SSIS, в котором я использую SQL Server для импорта «необработанных данных» и преобразования их в подходящие типы данных и сохранения их в таблицу. Для столбца У меня есть проблема с я сделал так (обратите внимание, я хочу только дату, а не значение времени, поэтому я использовать 112 в качестве параметра):Невозможно преобразовать между строковыми типами данных Unicode и non-unicode в SSIS

SELECT CONVERT(nvarchar(15),a.DeliveryDate,112) AS DeliveryDate 
INTO MyNewTable 
FROM MyRawDataTable 

Затем я использую MyNewTable в качестве вклада мой SSIS в Visual Basic. В потоке данных щелкните правой кнопкой мыши на моей исходной OLE DB и убедитесь, что тип данных на самом деле DT_WSTR длины 15 под Advanced Options и Input and Output datatypes.

Когда я пытаюсь запустить мой SSIS я получаю ошибку

Невозможно преобразовать между Юникода и не юникод типов строк данных

Что я фигурировал, возможно, придется делать с тем фактом, что a.DeliveryDate иногда содержат значения NULL. Я для этого настроить свой код в SQL server в:

SELECT 
CONVERT(nvarchar(15),COALESCE(a.DeliveryDate,'1900-01-01 00:00:00.000'),112) AS DeliveryDate 
INTO MyNewTable 
FROM MyRawDataTable 

, а затем запустить мой SSIS. Я замечаю, что у меня все еще есть DT_WSTR длины 15 в моем выходе из импорта OLE DB в SSIS. Это также приведет к той же ошибке.

Как я могу заставить свою программу работать? Я попытался преобразовать тип данных в varchar в моей таблице SQL, чтобы использовать COALESCE (..., 0) вместо использования 1900 года в качестве фиктивного значения.

Пожалуйста, обратите внимание на решение не может содержать трансформации Конверсия Data задач в поток данных SSIS.

EDIT: Я сделал те же преобразования для другой даты, которую я получил из того же файла необработанных данных. Для этой даты это работает без каких-либо ограничений. Мое заключение состоит в том, что может возникнуть проблема, когда DeliveryDate содержит значения NULL (мне не нужно использовать COALESCE для даты, которая работает, так как она всегда содержит допустимый тип данных).

EDIT 2: Я обновил свой SQL таблицу MyNewTable не включают в себя какие-либо строки, где a.DeliveryDate имели значение NULL. Однако это вызвало ту же проблему.

UPDATE Я заметил, что внешний вид в Я хочу, чтобы после моего обращения yyyymmdd за месяц на самом деле ISO. Поэтому я добавил CAST после моего CONVERSE, чтобы получить законный ввод в SSIS. Как это:

CAST(Convert(nvarchar(15),a.DeliveryDate,112) AS nvarchar(15)) AS DeliveryDate

Это вызывает у меня импорт из источника OLE DB в Date Flow SSIS не вызывает ошибку. Однако ошибка по-прежнему возникает при моем экспорте в мой Daywarehouse, который жалуется на типы данных. Несмотря на то, что он все еще говорит, что тип данных DT_WSTR на каждом этапе моего потока данных.

Кроме того, что странно, так это то, что при импорте из OLE DB с использованием таблицы это вызывает ошибку.Используя тот же запрос, я создаю свою таблицу с импортом (используя запрос в качестве входного файла), не вызывает проблем.

+0

Итак, Какова структура таблицы назначения? И изменили ли вы результат на DT_WSTR после того, как вы создали свой поток данных? например Ваш запрос сначала возвращал varchar, а затем nvarchar? SSIS иногда ведет себя с ошибкой, если исходные типы данных впоследствии меняются ... – Tyron78

+0

Моя таблица назначения также имеет DT_WSTR. В исходной базе данных она была возвращена как nvarchar, но с очень большим диапазоном, поэтому, когда я конвертирую некоторые типы данных в свою собственную таблицу SQL, которую я позже импортирую, я просто изменяю размер nvarchar на nvarchar (15) вместо своего исходного nvarchar (100) или так. При моем импортировании OLE DB в поток данных я отредактировал поврежденный столбец с DT_WSTR. Я позже выполняю функцию LOOKUP, которая не жалуется, когда я сопоставляю столбец ввода с столбцом вывода в отношении столбца Date. – Cenderze

+0

Что-то еще я заметил: вы должны изменить свой конвертировать в nvarchar (10) - иначе вы получите несколько смешных сформированных дат ... например. «1900-01-01 00: 0» – Tyron78

ответ

2

Вы могли бы хотеть попробовать: удалить OLE DB Source и восстановить ее с нуля с преобразованием в нем - это должно привести к колоннам и все метаданные, чтобы использовать WSTR с самого начала на ...

0

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

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

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

+0

Это мое убеждение, что я так сделал. Если вы увидите мой запрос, разве у меня что-то не так? SQL-запрос для преобразования в nvarchar преуспевает. При моем импорте в моем потоке данных я также назначаю столбцу стать DT_WSTR, но он не работает. – Cenderze

+0

Теперь я увидел, что вы написали W_STR, а не DT_WSTR, поэтому мне нужно, чтобы на нем что-то было, и посмотрим, смогу ли я внести какие-либо корректировки. Моя строка ввода имеет значение Datevalue в SQL Server, причем строки отображаются как, например, «2017-01-26 11: 32: 15.000» для сегодняшней даты. Из googling Ive пришел к выводу, что я должен использовать nvarchar и DT_WSTR, но, возможно, мне лучше использовать другое преобразование? – Cenderze

+0

Откройте пакет ssis в блокноте (файл dstx) и выполните глобальную нахождение и замену всех экземпляров validateExternalMetadata = «True» с validateExternalMetadata = «False». –