まず第一に (これが重要な場合に備えて) 私は ActiveState の Perl (MSWin32-x86-multi-thread 用にビルドされた v5.8.7) を使用しています。
エラーの原因を突き止めようとして、3 時間にわたるデバッグ セッションから抜け出しました。エラーはまったくないことがわかりましたが、何らかの理由Errors.Count
で、ストアド プロシージャの出力に出力されるメッセージごとに ADO の接続オブジェクトが増加していました。
次の Transact SQL コードを検討してください。
CREATE PROCEDURE dbo.My_Sample() AS
BEGIN TRAN my_tran
-- Does something useful
if @@error <> 0 BEGIN
ROLLBACK TRAN my_tran
RAISERROR( 'SP My_Sample failed', 16, 1)
END ELSE BEGIN
COMMIT TRAN my_tran
PRINT 'SP My_Sample succeeded'
END
多かれ少なかれ次のような Perl サブルーチンを想像してみてください:
sub execute_SQL {
# $conn is an already opened ADO connection object
# pointing to my SQL Server
# $sql is the T-SQL statement to be executed
my($conn, $sql) = @_;
$conn->Execute($sql);
my $error_collection = $conn->Errors();
my $ecount = $error_collection->Count;
if ($ecount == 0 ) { return 0; }
print "\n" . $ecount . " errors found\n";
print "Executed SQL Code:\n$sql\n\n";
print "Errors while executing:\n";
foreach my $error (in $error_collection){
print "Error: [" . $error->{Number} . "] " . $error->{Description} . "\n";
}
return 1;
}
別の場所で、メインの Perl コードで、上記のサブを次のように呼び出しています。
execute_SQL( $conn, 'EXEC dbo.My_Sample' );
最終的に、すべての PRINT ステートメントによって、新しい疑似エラーが ADO エラー コレクションに追加されることがわかりました。私が実装した簡単な修正は、SP の PRINT を SELECT に変更して、これをバイパスすることでした。
私が聞きたい質問は次のとおりです。
- この動作は正常ですか?
- それを回避/バイパスする方法はありますか?