Уменьшить вывод экспорта bcp

В нашем проекте мы используем команду bcp для экспорта около миллиона строк и записи вывода в выходной файл. Для импорта bcp я могу управлять выводом команды bcp с помощью переключателя -b, который указывает номер. строк для импорта в пакете. Вывод примерно такой:

Starting copy...
1000 rows sent to SQL Server. Total sent: 1000
1000 rows sent to SQL Server. Total sent: 2000
1000 rows sent to SQL Server. Total sent: 3000
1000 rows sent to SQL Server. Total sent: 4000
1000 rows sent to SQL Server. Total sent: 5000
1000 rows sent to SQL Server. Total sent: 6000
1000 rows sent to SQL Server. Total sent: 7000
1000 rows sent to SQL Server. Total sent: 8000
1000 rows sent to SQL Server. Total sent: 9000
1000 rows sent to SQL Server. Total sent: 10000
1000 rows sent to SQL Server. Total sent: 11000
1000 rows sent to SQL Server. Total sent: 12000
SQLState = 22001, NativeError = 0

можно легко уменьшить, увеличив число, отправляемое с помощью переключателя -b:

Starting copy...
10000 rows sent to SQL Server. Total sent: 10000
SQLState = 22001, NativeError = 0

12406 rows copied.
Network packet size (bytes): 4096
Clock Time (ms.) Total     : 75     Average : (165413.3 rows per sec.)

Но для экспорта bcp я не могу контролировать вывод, и для миллиона строк журнал становится слишком большим, например. приведенная ниже команда

bcp  Temp.dbo.TestTable out outdata.txt -t , -f file.fmt -S Server -U user-P password -m 10

выводит это:

Starting copy...
1000 rows successfully bulk-copied to host-file. Total received: 1000
SQLState = S1000, NativeError = 0
Error = [Microsoft][ODBC Driver 11 for SQL Server]Warning: BCP import with a format file will convert empty strings in delimited columns to NULL.
1000 rows successfully bulk-copied to host-file. Total received: 2000
1000 rows successfully bulk-copied to host-file. Total received: 3000
1000 rows successfully bulk-copied to host-file. Total received: 4000
1000 rows successfully bulk-copied to host-file. Total received: 5000
1000 rows successfully bulk-copied to host-file. Total received: 6000
1000 rows successfully bulk-copied to host-file. Total received: 7000
1000 rows successfully bulk-copied to host-file. Total received: 8000
1000 rows successfully bulk-copied to host-file. Total received: 9000
1000 rows successfully bulk-copied to host-file. Total received: 10000
1000 rows successfully bulk-copied to host-file. Total received: 11000
1000 rows successfully bulk-copied to host-file. Total received: 12000
1000 rows successfully bulk-copied to host-file. Total received: 13000
1000 rows successfully bulk-copied to host-file. Total received: 14000
1000 rows successfully bulk-copied to host-file. Total received: 15000
1000 rows successfully bulk-copied to host-file. Total received: 16000
1000 rows successfully bulk-copied to host-file. Total received: 17000
1000 rows successfully bulk-copied to host-file. Total received: 18000
1000 rows successfully bulk-copied to host-file. Total received: 19000
1000 rows successfully bulk-copied to host-file. Total received: 20000
1000 rows successfully bulk-copied to host-file. Total received: 21000
1000 rows successfully bulk-copied to host-file. Total received: 22000

Я пытался передать переключатель -b с помощью bcp out, но он всегда экспортирует их пакетом из 1000, и фильтрация строк с помощью greping или seding займет слишком много времени. Спасибо за вашу помощь.


person Ashish Gaur    schedule 18.10.2013    source источник
comment
Я не совсем уверен, в чем здесь проблема. Ваш BCP не работает или есть какие-то данные, которые вы пытаетесь увидеть в исходящих сообщениях BCP, которые вам необходимо увидеть?   -  person Michael Gardner    schedule 18.10.2013
comment
Я хочу уменьшить появление таких строк 1000 rows successfully bulk-copied to host-file. Total received: 2000, так как мы записываем вывод bcp в файл, а в некоторых случаях есть миллионы строк, поэтому файлы журнала становятся довольно большими, я хочу уменьшить размер файлов журнала, не влияя на производительность. бкп.   -  person Ashish Gaur    schedule 18.10.2013
comment
Хорошо, это проясняет это. Хотя не уверен, что это возможно... удачи.   -  person Michael Gardner    schedule 18.10.2013
comment
Это новинка для bcp? У меня та же проблема с использованием bcp на машине с Linux, но у меня есть другой процесс на более старом сервере (только на год), который использует bcp и не производит этот вывод. Оба используют Linux Centos7.   -  person lampShadesDrifter    schedule 02.08.2019


Ответы (5)


Кажется, в bcp нет решения для этого. Однако есть обходной путь; упакуйте командную строку bcp в оператор xp_cmdshell и укажите параметр no_output:

EXEC xp_cmdshell "bcp  Temp.dbo.TestTable out outdata.txt -t , -f file.fmt -S Server -U user-P password -m 10", no_output

Источник: нажмите здесь

person one angry researcher    schedule 27.04.2014
comment
Проблема не в выводе, а в длине вывода, я хочу получить меньше вывода, но мне это нужно, ваше решение удалит любой вывод из файлов журнала. - person Ashish Gaur; 27.04.2014

  1. Вы можете либо перенаправить вывод в файл, используя >

    bcp sometable out outfile -S Server -U user -P password > export.log

    Обратите внимание на бит > export.log в конце. Это заполнит файл export.log журналом. Поэтому в случае сбоя вашей команды вы можете проверить. Подробнее об этом подходе см. здесь.

  2. bcp также предоставляет выходной параметр -o

    bcp sometable out outfile -S Server -U user -P password -o export.log

    На этот раз обратите внимание на -o export.log в конце.

person ravish.hacker    schedule 23.05.2017
comment
Я использую bcp Версия: 17.3.0000.1 из пакета mssql-tool centos7, и он говорит мне, что -o не является допустимым вариантом. На какой версии и ОС это используется? - person lampShadesDrifter; 02.08.2019

Блокировать вывод командной строки:

bcp Temp.dbo.TestTable out outdata.txt -t , -f file.fmt -S Server -U user-P password -m 10>nul

person KaM    schedule 10.02.2017

Я знаю, что это старо, но я наткнулся на него в поисках того же ответа и вижу, что здесь нет хорошего ответа. Я придумал следующее, что дало мне то, что я хотел, и подумал, что опубликую здесь, если это поможет кому-то другому:

set @BCP_CMD = 'bcp ...etc...'; -- declare and set this appropriately
DROP TABLE IF EXISTS #bcpOutput;
CREATE TABLE #bcpOutput ([BCP_Output] varchar(2048)); 
Insert into #bcpOutput ([BCP_Output]) EXECUTE master..xp_cmdshell @BCP_CMD;
SELECT BCP_Output FROM #bcpOutput where 
-- Here I filter out Blank lines, all those "rows successfully..." lines, etc.
BCP_Output not like '' 
    AND BCP_Output not like '%rows successfully%' 
    AND BCP_Output not like '%S1000%' 
    AND BCP_Output not like '%empty strings in delimited%' 
    AND BCP_Output not like '%Starting copy%' 
    AND BCP_Output not like '%Network packet size%' ;

Это производит:

BCP_Output
69673 rows copied.
Clock Time (ms.) Total     : 406    Average : (171608.38 rows per sec.)

Альтернативный метод технически «работает» просто отлично: append

 | grep -v -e "rows successfully\|Starting copy\|...and so on..."

к вашей команде "bcp...". Однако для меня это превратило ‹5-секундную операцию bcp почти в 30 секунд, что было неприемлемо. Возможно, в вашей среде конвейер для grep работает лучше. Может стоит попробовать.

person BRebey    schedule 27.02.2019

Очень простое решение — использовать out-null.

Просто добавьте | out-null в конце команды.

Eg:

bcp  xxxxxxxxxxxxxxxxxxxx   | out-null
person Nigel Fds    schedule 07.04.2021