Тип данных приведенный не будет прилипать в SSIS
Я пытаюсь автоматизировать процесс с помощью SSIS, который экспортирует данные в плоский файл (.csv), который затем сохраняется в каталоге, где он будет сканироваться и импортироваться некоторым бухгалтерским программным обеспечением. Программное обеспечение (к сожалению) распознает только даты в формате ММ / ДД / ГГГГ. Я пытался всеми способами привести или преобразовать данные, извлеченные из SQL, в MM / DD / YYYY, но каким-то образом данные всегда распознаются как тип данных DT_Date или DT_dbDate в соединении плоских файлов и сохраняются как YYYY-MM-DD.
Я пробовал различные комбинации преобразования данных, производных столбцов и изменения свойств столбцов плоского файла на строковые в надежде, что я смогу хотя бы использовать операции подстроки, чтобы правильно отформатировать этот формат, но его никогда не удается сохранить как YYYY- MM-DD. Это действительно сбивает с толку. The preview in the OLE DB source will show the dates as "MM/DD/YYYY" but somehow it always changes to "YYYY-MM-DD" when it hits the flat file.
I've tried to look up solutions (for example, here: /questions/25963060/tip-dannyih-upornyih-stolbtsov-v-dispetchere-soedinenij-s-ploskimi-ploskimi-fajlami-sluzhb-ssis-ne-izmenitsya) but with no luck. Amazingly if I merely open the file in Excel and save it, it will then show dates in a text editor as "MM/DD/YYYY", only adding more mystery to this Bermuda Triangle-esque caper.
Если есть какие-либо советы, я был бы очень признателен.
2 ответа
Это было какое-то время, но я только что столкнулся с этим сегодня, потому что у меня была та же проблема, и я надеюсь, что смогу избавить кого-то от необходимости разобраться в этом. Для меня работало добавление нового поля в преобразование "Производный столбец", а не попытка изменить существующее поле.
редактировать
Я не могу комментировать ответ Троя Виттофта, но хотел заметить, что если у вас есть ввод типа Date, вы не сможете выполнить SUBSTRING. Вместо этого вы можете использовать что-то вроде этого:
(DT_WSTR,255)(MONTH([Visit Date])) + "/" + (DT_WSTR,255)(DAY([Visit Date])) + "/" + (DT_WSTR,255)(YEAR([Visit Date]))
Это проблема форматирования даты.
В SQL и в SSIS даты имеют один буквенный формат строки, а это ГГГГ-ММ-ДД. Не обращайте внимания на то, как они выглядят вам в средстве предварительного просмотра данных и / или Excel. Даты отображаются для вас в зависимости от региональных настроек Windows.
Выше - в отличие от США - люди в Великобритании будут видеть все даты как ДД / ММ / ГГГГ. То, как нам показывают даты, это НЕ то, как они хранятся на диске. Когда вы открываете в Excel, он делает это преобразование в качестве одолжения. До тех пор, пока вы не СОХРАНИТЕ, даты сохраняются в виде текста в соответствии с вашими региональными предпочтениями.
Для того чтобы даты всегда отображались одинаково. Мы должны сохранять их не как даты, а как строки текста. Чтобы сделать это, мы должны получить данные из столбца даты DT_DATE
или же DT_DBDATE
и в столбец строки: DT_STR
или же DT_WSTR
, Затем отобразите этот новый строковый столбец в свой CSV-файл. Два способа сделать это преобразование даты в строку...
Во-первых, пусть SQL это сделает. Обновите запрос источника OLE DB и добавьте еще один столбец...
SELECT
*,
CONVERT(VARCHAR(10), MyDateColumn, 101) AS MyFormattedDateColumn
FROM MyTable
Другой способ - позволить SSIS сделать это. Добавьте компонент производного столбца с выражением
SUBSTRING([MyDateColumn],6,2) + "/" + SUBSTRING([MyDateColumn],8,2) + "/" + SUBSTRING([MyDateColumn],1,4)
Сопоставьте строковые столбцы с вашим CSV-файлом, а НЕ с датами. Надеюсь это поможет.