SQL Server 2017 - Массовая вставка типа SQLBIT с использованием файла формата и параметра FORMAT = CSV - PullRequest
0 голосов
/ 03 мая 2020

У меня есть входной файл CSV. Данные в CSV заключены в текстовый квалификатор (двойные кавычки). Поэтому для массовой вставки, чтобы удалить двойные кавычки при вставке в таблицу, я использую параметр FORMAT = 'CSV'.

Один из столбцов в CSV содержит логические данные (TRUE / FALSE), и я хочу, чтобы они были вставлены в SQL таблицу (SQL 2017) как 1 и 0 со своими тип данных, как бит. Поэтому в файле формата я указал его тип как SQLBIT, а для других SQLCHAR.

Но при массовой вставке происходит сбой Ошибка:

Cannot bulk load CSV file. Invalid field parameters are specified for source column number 3 in the format file. All data fields must be either character or Unicode character with terminator when CSV format is specified.

Из вышеприведенной ошибки я понял одну вещь: когда я использую параметр FORMAT = 'CSV', я не может использовать SQLBIT в файле формата. С SQLCHAR он работает, но затем в таблице SQL я должен изменить тип данных на varchar (5) вместо бита, который мне не нужен.

Так есть способ, при котором я могу использовать оба SQLBIT в формате файл при использовании параметра FORMAT = 'CSV' ИЛИ ​​если не SQLBIT, то любой другой метод для вставки значений в таблицу SQL как 1 и 0 без изменения типа данных?

Ввод CSV:

Id,Address,IsActive,CreatedDate
"I1","NY,U.S.","TRUE","2020-01-01"
"I2","Perth,Aus","FALSE","2020-02-01"

SQL ТАБЛИЦА:

Create table dbo.Bulk_Fmt_Test
(
   Id char(2) not null,
   Address varchar(255),
   IsActive bit,
  CreatedDate datetime2
)

Формат файла:

14.0
4
1 SQLCHAR 0 9999 "," 1 Id ""
2 SQLCHAR 0 9999 "," 2 Address ""
3 SQLBIT  0  1   "," 3 IsActive ""
4 SQLCHAR 0 9999 "\n" 4 CreatedDate ""

Массовая вставка Запрос:

BULK INSERT dbo.Bulk_Fmt_Test from 'C:\Data\Sample1.csv'
WITH (FORMAT = 'CSV', FIRSTROW = 2, FormatFile = 'C:\Data\Sample.fmt');

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Файл формата описывает формат файла, а не таблицу. Строки «TRUE» и «FALSE» являются символьными данными, а не двоичным битовым значением, которое указывает спецификация формата SQLBIT. Эти логические строковые значения могут быть неявно преобразованы в бит в T- SQL, но BULK INSERTBCP) этого не делает.

В качестве обходного пути укажите SQLCHAR в файле формата и используйте INSERT … FROM OPENROWSET … BULK для неявного преобразования логических значений. Я тестировал приведенный ниже пример с Windows символами конца строки CR / LF вместо только LF, как в вашем вопросе, но я ожидаю, что вы получите желаемые результаты и с LF:

14.0
4
1 SQLCHAR 0 9999 "," 1 Id ""
2 SQLCHAR 0 9999 "," 2 Address ""
3 SQLCHAR 0 5    "," 3 IsActive ""
4 SQLCHAR 0 9999 "\r\n" 4 CreatedDate ""

T- SQL заявление:

INSERT INTO dbo.Bulk_Fmt_Test(Id, Address, IsActive, CreatedDate)
SELECT Id, Address, IsActive, CreatedDate
FROM OPENROWSET(BULK N'C:\Data\Sample1.csv',
    FORMATFILE = N'C:\Data\Sample.fmt',
    FIRSTROW=2,
    FORMAT='CSV') AS source;
1 голос
/ 03 мая 2020

Вы можете сначала вставить во временную таблицу, затем проверить ее и вставить в свою таблицу. Таким образом, вы можете вставить без ошибки.

CREATE TABLE #Bulk_Fmt_Test(
   Id varchar(100),
   Address varchar(300),
   IsActive varchar(10),
   CreatedDate varchar(20)
)

BULK INSERT #Bulk_Fmt_Test from 'C:\Data\Sample1.csv'
WITH (FORMAT = 'CSV', FIRSTROW = 2, FormatFile ='C:\Data\Sample.fmt');

INSERT INTO Bulk_Fmt_Test (Id, Address, IsActive, CreatedDate)
SELECT
TRY_CONVERT(char(2), Id),
LEFT(Address, 255),
ISNULL(TRY_CONVERT(bit, IsActive), IIF(IsActive = 'TRUE', 1, 0)),
TRY_CONVERT(datetime2, CreatedDate)
FROM #Bulk_Fmt_Test

Примечание: TRY_CONVERT является зарезервированным ключевым словом на уровне совместимости 110 и выше. Подробная информация здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...