SQl Server 2014 BCP BulkCopy удалить последнюю пустую строку

Пожалуйста, может ли кто-нибудь посоветовать, есть ли метод, который можно использовать для остановки команды массового копирования BCP SQL Server, создающей окончательный возврат каретки и, следовательно, пустую строку в конце файла?

Я гуглил, но не нашел подходящего ответа.

Код, который я использовал в своей хранимой процедуре, приведен ниже. Запрос и путь к файлу были опущены, но переменные SQL остались:

    /* Prepare the command */
    DECLARE @Command VARCHAR(4000);
    SELECT  @Command = 
                'bcp "'             /* Bulk Copy command */
    +           @Query              /* The query to output */
    +           '" queryout '       /* Output the results of the query */
    +           @FullFilePath       /* The file path to write to */
    +           ' -c -t"|" -T -S'   /* Switches (See below) */
    +           @@servername;       /* The server name */


    /*
        BCP Command Swtitches
            -c Output in ASCII with the default field terminator (tab) and row terminator (crlf)
            -t override the field terminator with "|"
            -T use a trusted connection. Note that U –P may be used for username/password
            -S connect to this server to execute the command
    */

    /* Execute the command */
    exec master..xp_cmdshell @Command;

Спасибо.


person Dib    schedule 23.01.2015    source источник


Ответы (1)


Я боролся с тем же, и единственный способ исправить это — НЕ ИСПОЛЬЗОВАТЬ пользовательский разделитель столбцов -t/t в запросе BCP.

Итак, мой исходный синтаксис экспорта BCP:

bcp "select 1 from [myDB].[dbo].[db_status] WHERE db_idx = 0" queryout c:\db_migration_log.txt -c -t/t -S127.0.0.1,2044 -Uuser -Ppassword

пришлось поменять на:

bcp "select 1 from [myDB].[dbo].[db_status] WHERE db_idx = 0" queryout c:\db_migration_log.txt -c -S127.0.0.1,2044 -Uuser -Ppassword

Затем мой запрос на импорт работал нормально (игнорируя последнюю строку) следующим образом:

SET QUOTED IDENTIFIER OFF
SET NOCOUNT ON
BULK INSERT [myDB].[dbo].[mayTable] FROM 'c:\myfile.csv'
WITH
(
FIELDTERMINATOR = '\t',
ROWTERMINATOR = '\n'
)
person Milan    schedule 14.12.2015
comment
Отлично, выглядит многообещающе. Если я когда-нибудь вернусь к этому проекту, я буду иметь в виду ваше решение! Спасибо. - person Dib; 15.12.2015
comment
..также я заметил, что для некоторых файлов с двоичными данными вышеописанное не работает, поэтому в этом случае я использую экспорт/импорт с параметром -n и -t/t для этих случаев появляется ошибка EOL. - person Milan; 15.12.2015
comment
Спасибо за обновление. Я тоже буду иметь это в виду. - person Dib; 15.12.2015