2012-04-18 167 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