当BCP失败时,Perl system()命令不会返回失败

时间:2012-04-18 14:37:50

标签: perl ipc

我正在使用Perl程序中的BCP实用程序将文件导入SQL Server。 在我导入的文件中,日期格式错误,因此导入过程失败并显示以下错误:

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

我正在我的perl程序中执行bcp命令,如下所示。

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 个答案:

答案 0 :(得分:3)

system()只返回它调用的程序的退出状态。如果system()返回0,则该程序退出该程序。对于那些指示错误然后exit()具有非零状态的程序,通常被认为是礼貌的,但这绝不是强制执行的。可能只是程序设计不合理。

您可以做的一件事是捕获程序的STDOUT和/或STDERR流并查找特定模式,或者至少查找任何模式。如果在STDERR上打印了任何内容,则可能会猜到发生了错误。

有关捕获这些内容的信息,请参阅IPC::RunIPC::Open2IPC::Open3

答案 1 :(得分: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;