2012-04-18 149 views
-1

我正在使用Perl程序中的BCP实用程序将文件导入到SQL Server中。 在这我导入的文件,有一个错误的日期格式,以便导入过程失败,以下错误:当BCP失败时,Perl系统()命令不会返回失败

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 2012-04-18 14:43:52

+0

是的,它被正确引用。我只是给出了格式。 – user1019072 2012-04-18 14:46:28

+2

除了您的实际代码外,您绝不应该发布任何内容,完全按照它的样子发布。当然不是无法编译的代码。它只会增加混淆。你应该知道'system'不会返回错误代码,只有程序的退出状态。见'perldoc -f系统'。 – TLP 2012-04-18 14:50:45

回答

0

你应该重定向STDERR通过2>&1如下到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; 
+0

请问这个命令my $ myResult ='$ myBcp 2> &1';有用吗?或者我应该使用system my $ myResult = system('$ myBcp 2> &1';) – user1019072 2012-04-18 14:48:14

+0

@ user1019072 - 反向引用将被调用的程序打印到STDOUT。系统只返回退出状态。 – 2012-04-18 14:52:22

+0

好的感谢澄清。我会尝试。 – user1019072 2012-04-18 14:54:17

3

system()简单地返回其调用程序的退出状态。如果system()返回0,那么这就是程序退出。对于程序来说,它通常被认为是彬彬有礼的,因为程序指示错误exit()的状态为非零,但这决不会在任何地方执行。这可能只是该计划设计不佳。

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

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