Я установил решение 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 с использованием таблицы это вызывает ошибку.Используя тот же запрос, я создаю свою таблицу с импортом (используя запрос в качестве входного файла), не вызывает проблем.
Итак, Какова структура таблицы назначения? И изменили ли вы результат на DT_WSTR после того, как вы создали свой поток данных? например Ваш запрос сначала возвращал varchar, а затем nvarchar? SSIS иногда ведет себя с ошибкой, если исходные типы данных впоследствии меняются ... – Tyron78
Моя таблица назначения также имеет DT_WSTR. В исходной базе данных она была возвращена как nvarchar, но с очень большим диапазоном, поэтому, когда я конвертирую некоторые типы данных в свою собственную таблицу SQL, которую я позже импортирую, я просто изменяю размер nvarchar на nvarchar (15) вместо своего исходного nvarchar (100) или так. При моем импортировании OLE DB в поток данных я отредактировал поврежденный столбец с DT_WSTR. Я позже выполняю функцию LOOKUP, которая не жалуется, когда я сопоставляю столбец ввода с столбцом вывода в отношении столбца Date. – Cenderze
Что-то еще я заметил: вы должны изменить свой конвертировать в nvarchar (10) - иначе вы получите несколько смешных сформированных дат ... например. «1900-01-01 00: 0» – Tyron78