当 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>&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>&1
;工作?或者我应该使用 system my $myResult = system($myBcp 2>&1
;)
@user1019072 - 反引号返回任何打印到 STDOUT 的调用程序。系统只返回退出状态。以上是关于当 BCP 失败时,Perl system() 命令不返回失败的主要内容,如果未能解决你的问题,请参考以下文章
perl 中的 system("tar xzf DirName/tarFile.tar DirNameInsideTar/FileName") 失败并返回 -1
C:\Windows\System32\bcp47mrm.dll没有被指定在Windows上运行,或者它包含错误。 这个怎么解决?