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

Posted

技术标签:

【中文标题】当 BCP 失败时,Perl system() 命令不返回失败【英文标题】:Perl system() command doesnt return failure when BCP fails 【发布时间】:2012-04-18 14:37:50 【问题描述】:

我正在使用 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 程序中捕获 Invalid Date Format 错误?

谢谢

【问题讨论】:

我假设在您的实际程序中,$myBcp 中的字符串被正确引用,而不像您上面发布的那样? 是的,它被正确引用。我只是给出格式。 你不应该发布任何东西,除了你的实际代码,就像它看起来一样。当然不是不能编译的代码。它只会增加混乱。您应该知道system 不返回错误代码,只返回程序的退出状态。见perldoc -f system 你没有给出格式,你给出了一些看起来像伪代码的东西,它会给出诸如“未引用的字符串'表'可能与未来的保留字冲突..”这样的错误你是如何引用的该字符串是回答问题的重要信息。 我已经给你答案了:system 不返回错误。我不是在责备你,我是在询问你如何引用字符串的信息,因为你发布的不是你实际拥有的。无论如何......似乎你的问题得到了回答。 【参考方案1】:

system() 只返回它调用的程序的退出状态。如果system() 返回 0,那么这就是程序退出的原因。对于以非零状态向exit() 指示错误的程序,通常认为这是礼貌的,但这绝不是在任何地方强制执行的。可能只是程序设计不佳。

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

有关捕获这些的信息,请参阅IPC::Run、IPC::Open2 或 IPC::Open3。

【讨论】:

【参考方案2】:

您应该通过2&gt;&amp;1 将 STDERR 重定向到 STDOUT,如下所示:

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;

【讨论】:

这个命令我的 $myResult = $myBcp 2&gt;&amp;1;工作?或者我应该使用 system my $myResult = system($myBcp 2&gt;&amp;1;) @user1019072 - 反引号返回任何打印到 STDOUT 的调用程序。系统只返回退出状态。

以上是关于当 BCP 失败时,Perl system() 命令不返回失败的主要内容,如果未能解决你的问题,请参考以下文章

perl 中的 system("tar xzf DirName/tarFile.tar DirNameInsideTar/FileName") 失败并返回 -1

C:\Windows\System32\bcp47mrm.dll没有被指定在Windows上运行,或者它包含错误。 这个怎么解决?

Perl:当子/管道的文件句柄被别名时,关闭子进程失败

Perl:在不死的情况下捕获错误

从 bcp 客户端接收到 colid 6 的无效列长度

bcp47mrm.dll文件缺失怎么办