Ошибка выброса массовой вставки SQL Server в ноль, когда столбец не допускает ноль - PullRequest
0 голосов
/ 09 ноября 2018

В SQL Server (я использую 2016) есть функция Bulk Insert, которая позволяет вставлять записи из плоского файла.

Если поле в плоском файле имеет значение NULL, а поле в SQL Server не помечено, чтобы разрешить нулевые значения, то при групповой вставке при вставке будет использоваться пустая строка.

Есть ли способ переопределить это поведение, чтобы, когда поле было пустым, вместо пустой строки использовалось пустое значение. И потому что поле не установлено в нуль для него, чтобы затем выдать ошибку?

Почему я спрашиваю об этом? Хорошо, потому что поля молча вставляют пустое строковое значение, и я не хочу этого.

ПРИМЕЧАНИЕ : я строго имею в виду использование T-SQL с использованием BULK INSERT (не bcp или любым другим способом)

ПРИМЕЧАНИЕ : я видел Сохранить пустые значения или использовать значения по умолчанию при массовом импорте (SQL Server) , то, что я здесь описал, я не смог найти в этом документе. Если вы считаете, что это включает в себя то, что я ищу, укажите, что мне не хватает, вместо того, чтобы направить меня к этому документу. Спасибо.

ПРИМЕЧАНИЕ : Вот простой пример (обратите внимание, что я работаю не с таблицей, а с простым примером, чтобы прояснить ситуацию)

Определение таблицы:

CREATE TABLE [dbo].[TableOne](
    [Id] [int] NOT NULL,
    [Name] [varchar](10) NOT NULL
)

Команда массовой вставки

BULK
  INSERT TableOne
      FROM 'R:\TableOne.txt'
            WITH(
                  DATAFILETYPE = 'widechar',
                  FIELDTERMINATOR = '\t',
                  ROWTERMINATOR = '\n'
                )

Файл

1   

Таким образом, в основном в этом примере это: 1 [Tab] [CRLF], где второй столбец - имя, и это нуль.

Результат

enter image description here

1 Ответ

0 голосов
/ 09 ноября 2018

Вы не можете сделать это только с помощью BULK INSERT - это поведение задокументировано , и, насколько я могу судить, нет варианта, который что-то меняет:

При импорте в символьный столбец, определенный с помощью NOT NULL ограничение, BULK INSERT вставляет пустую строку, когда нет значения в текстовом файле.

Нет опции TREAT_BLANK_AS_NULL или чего-то такого, что могло бы помочь этому сценарию.

Единственное решение, которое я могу придумать, - это добавить ограничение и использовать CHECK_CONSTRAINTS в BULK INSERT. Если вам неудобно постоянно помечать столбец этим ограничением (поскольку в других сценариях может быть законная необходимость вставлять пустые значения или они уже есть?), Вы можете временно добавить его:

ALTER TABLE TableOne WITH NOCHECK ADD CONSTRAINT CK_Name_NotEmpty CHECK ([Name] <> '');
BEGIN TRY
    BULK INSERT TableOne FROM 'C:\Temp\a.txt' WITH (
        DATAFILETYPE = 'widechar',
        FIELDTERMINATOR = '\t',
        ROWTERMINATOR = '\n',
        CHECK_CONSTRAINTS
    )
END TRY
BEGIN CATCH
    ALTER TABLE TableOne DROP CONSTRAINT CK_Name_NotEmpty;
    THROW;
END CATCH
ALTER TABLE TableOne DROP CONSTRAINT CK_Name_NotEmpty;

Очевидно, что это немного неудобно, если таблица динамическая, вам нужно обрабатывать многие столбцы таким образом, или вы не можете позволить себе проверить ограничения. В этот момент я бы рекомендовал использовать правильное решение ETL, например пакет служб SSIS.

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