首先(如果这很重要)我使用的是 ActiveState 的 Perl(为 MSWin32-x86-multi-thread 构建的 v5.8.7)。
我刚刚从长达三个小时的调试会议中走出来,试图找到错误的根源。我发现根本没有错误,但由于某种原因,ADO 的连接对象Errors.Count
随着存储过程输出中的每条打印消息而增加。
考虑以下 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 或多或少像:
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,以绕过它。
我想问的问题是:
- 这种行为正常吗?
- 有没有办法避免/绕过它?