2012-04-18 3 views
-1

Я импортирую файл в SQL Server с помощью утилиты BCP в программе Perl. В файле, который я ввожу, есть неправильный формат даты, поэтому процесс импорта завершается с ошибкой при слежении:Команда Perl system() не возвращает сбой при сбое BCP

SQLState = 22008, NativeError = 0 
Error = [Microsoft][SQL Server Native Client 10.0]Invalid date format 

Я уверен, выполнение команды BCP следующим образом в моей PERL программе.

my $myBcp = "bcp.exe" <table name> in <temp file path> -f<format file> -m 1 -h "FIRE_TRIGGERS" -o<log file path> 
my $myResult = system($myBcp); 

При печати $myResult это дает мне '0'. Так как есть ошибка «Недействительный формат даты», она должна вернуть мне код ошибки.

Может ли кто-нибудь сообщить мне, как уловить неверную ошибку формата даты в моей программе perl?

Благодаря

+2

Я предполагаю, что в вашей реальной программе строка в '$ myBcp' правильно цитируется, а не нравится то, что вы разместили выше? – TLP

+0

да, это правильно процитировано. Я просто давал формат. – user1019072

+2

Вы никогда не должны публиковать ничего, кроме своего фактического кода, точно так же, как он появляется. И, конечно, не код, который не будет компилироваться. Это лишь добавляет путаницы. Вы должны знать, что 'system' не возвращает коды ошибок, а только статус выхода программы. См. 'Perldoc -f system'. – TLP

ответ

0

Вы должны перенаправить STDERR на STDOUT по 2>&1 следующим образом:

my $myBcp = '"bcp.exe" <table name> in <temp file path> -f<format file> -m 1 -h "FIRE_TRIGGERS" -o<log file path>'; 
my $myResult = `$myBcp 2>&1`; 
print $myResult; 
+0

Будет ли эта команда my $ myResult = '$ myBcp 2> &1'; работать? или Должен ли я использовать систему my $ myResult = system ('$ myBcp 2> &1';) – user1019072

+0

@ user1019072 - Обратные кавычки возвращают все вызовы, которые вызывается в STDOUT. Система возвращает только статус выхода. –

+0

ОК спасибо за разъяснение. Я попробую. – user1019072

3

system() просто возвращает статус завершения программы она вызывается. Если system() возвращает 0, то это то, с чем вышла программа. Обычно это считается вежливым для программ, которые указывают на ошибки до exit() с ненулевым статусом, но это никоим образом не выполняется. Может быть, программа плохо разработана.

Одна вещь, которую вы можете сделать, это захватить потоки программы STDOUT и/или STDERR и искать определенные шаблоны или, по крайней мере, что-либо вообще. Если что-то напечатано на STDERR, вероятно, предположим, что произошла ошибка.

Для получения информации об их устранении см. IPC::Run, IPC::Open2 или IPC::Open3.

Смежные вопросы