Импорт данных Datetime в хранилище SQL Server с использованием BCP

Каждый день я получаю текстовый файл, который выглядит следующим образом:

128CAFEE-38B0-5A6A-8C21-E2BDA1E57FE4    353386068937487 10320   2019-06-20T23:56:14Z
128CAFEE-38B0-5A6A-8C21-E2BDA1E57FE4    353386068937487 10320   2019-06-20T23:56:14Z
128CAFEE-38B0-5A6A-8C21-E2BDA1E57FE4    353386068937487 10320   2019-06-20T23:56:14Z

Я пытаюсь импортировать это в хранилище Azure SQL Server, используя BCP.

Определение загружаемой таблицы выглядит следующим образом:

CREATE TABLE
 mytable
(var1 VARCHAR(36) NOT NULL, 
 var2 BIGINT NOT NULL, 
 var3 INTEGER NOT NULL, 
 var4 DATETIME2 NOT NULL)

Я использую файл fmt, который выглядит так:

13.0
4
1       SQLCHAR             0       36      "\t"   1     var1                                         SQL_Latin1_General_CP1_CI_AS
2       SQLBIT              0       1       "\t"   2     var2                                         ""
3       SQLINT              0       4       "\t"   3     var3                                         ""
4       SQLDATETIME         0       8       "\n"   4     var4                                         ""

У меня проблемы с элементом datetime этого - я получаю следующую ошибку:

Error = [Microsoft][ODBC Driver 13 for SQL Server]Invalid date format

Есть ли способ определить, что такое информация о дате и времени, т.е. могу ли я дать BCP строку стиля ГГГГ-мм-ДД\ТЧЧ:ММ:СС, чтобы он мог интерпретировать моя дата правильно?

Пожалуйста, ограничьте ответы использованием BCP.


person paul frith    schedule 01.07.2019    source источник


Ответы (1)


Вы не сможете импортировать этот формат даты непосредственно в столбец datetime2 с помощью bcp (насколько мне известно - рад исправить). Используйте промежуточную таблицу, импортируйте в столбец char(20), затем используйте CAST для преобразования, например

SELECT CAST( yourCharDateColumn AS DATETIME2 ) AS x
FROM yourStagingTable

При таком подходе вы можете забыть о файле формата и просто использовать переключатель -c с bcp. Актерский состав прошел мои тесты успешно.

Я заметил, что второй столбец в вашем файле форматирования помечен как SQLBIT, хотя должен быть SQLBIGINT.

Что касается использования bcp, мне интересно понять, почему вы выбрали использование этого устаревшего командного инструмента, где Polybase является рекомендуемым способом быстрого получения данных в хранилище данных SQL Azure. CREATE EXTERNAL FILE FORMAT даже есть переключатель DATE_FORMAT, который, хотя я и не пробовал, может работать с этим форматом. Если вы должны использовать bcp, а исходные данные поступают с другого SQL Server, то использование собственного переключателя (-n) при экспорте работает хорошо, а также устраняет необходимость в файле форматирования. В качестве альтернативы рассмотрите фабрику данных, которая должна быть в состоянии обрабатывать преобразование, необходимое для вашего столбца даты.

person wBob    schedule 01.07.2019
comment
Опция приведения сработала, и SQLBIT была опечаткой в ​​моем вопросе. BCP был рекомендован самой Microsoft, что может быть связано с нашей конкретной настройкой здесь, но, взглянув на полибазу, я думаю, что это может быть лучшим вариантом. - person paul frith; 02.07.2019