2014-03-12 40 views
1

我使用“Microsoft SQL Server Native Client 11.0”从传统ASP调用SQL Server存储过程。多年来我一直这样做。我刚刚开发了一个存储过程,它使用PRINT语句在开发过程中提供信息性消息,以及从MSSMS中调用时。但是,当我通过SQL Server Native Client从传统ASP调用相同的存储过程时,出现错误代码中出现的第一个PRINT语句的文本时出现0x80040e14错误。Microsoft SQL Server Native Client受PRINT语句支持

我已经搜索了这个问题,但无法找到任何地方,它说你不能这样做,所以我想知道如果我错过了某个地方的把戏。任何人都可以指出我有证据表明我不能包含PRINT语句(嘘!)或者我做了一些愚蠢的事情吗?

例外:

在 HTTP在71行,第3列

未处理的异常://本地主机:3000 /数据访问/ Workpalces.asp

0x80040e14 - Microsoft SQL Server的本机客户端11.0 :---- START Assessment.RefreshUP ----

我的存储(略)步骤:

CREATE PROCEDURE Assessment.RefreshUP 
    @OrgID int, 
    @UserID int = NULL, 
    @BaseDate smalldatetime = NULL 
AS 
BEGIN 
    SET NOCOUNT ON 
    DECLARE @Error    int 
    DECLARE @RowCount   int 
    BEGIN TRY 
     PRINT '---- START Assessment.RefreshUP ----' 
     (snip) 

我的经典ASP召唤:

' Assessment.RefreshUP 
' ======================== 
' Creates or updates a Workplace 
Function Assessment_RefreshUP(rs, OrganisationID, UserID) 
    Stop 
    Dim cmd 
    Set cmd = Server.CreateObject("ADODB.Command") 
    Set rs = Server.CreateObject("ADODB.Recordset") 
    cmd.ActiveConnection = DBConnString 
    cmd.CommandType = adCmdStoredProc 
    cmd.CommandText = "Assessment.RefreshUP" 
    cmd.Parameters.Append cmd.CreateParameter("@OrgID", adInteger, adParamInput, 0, OrganisationID) 
    cmd.Parameters.Append cmd.CreateParameter("@UserID", adInteger, adParamInput, 0, UserID) 
' cmd.Parameters.Append cmd.CreateParameter("@BaseDate", adDate, adParamInput, 0, Null) 
    rs.CursorLocation = adUseClientBatch 
    rs.Open cmd, , adOpenStatic, adLockReadOnly 
    Set rs.ActiveConnection = Nothing 
    Set cmd = Nothing 
End Function 
+0

你可以发布你的完整存储过程,感觉你的'PRINT'不是问题。它出现在以后的例外情况中,因为错误代码引用了'字符串后的未封闭引号'。正如你的'PRINT'语句输出怀疑这是问题所在。 – Lankymart

+0

我怀疑你是对的,因为我刚刚偶然发现了一个不同的ASP /存储过程调用,它们中有PRINT语句,但不影响它们。我应该编辑我的原始帖子还是在评论中添加完整的存储过程? –

+0

只需编辑您现有的文章扩展您的存储过程代码,您可以在文章的底部留下编辑,说您已更新它,但说实话人们会知道。 ;) – Lankymart

回答

1

问题的根源可以通过查看异常代码(0x80040e14),而不是依赖于异常文本(“---- START Assessment.RefreshUP ----”)中找到。

在我的情况下,问题是对存储过程中进一步向下的用户定义函数(UDF)的调用不存在。然而,PRINT语句的存在影响了异常“文本”,并导致我错误的路径。

您可以在经典ASP/SQL Server Native Client中调用的存储过程中使用PRINT语句。

如果遇到问题,请尝试直接从MSSMS调用存储过程,理想情况下使用从SQL事件探查器捕获的SQL来确定问题的真正来源。

1

PRINT语句是伟大的调试目的,但已经遇到了这些问题,我发现您的存储过程有一个额外的参数有点像@debug TINYINT = 0是有益的不在默认情况下显示PRINT语句或调试任何类型的输出,但允许您在想要调试过程时将其打开。

CREATE PROCEDURE Assessment.RefreshUP 
    @OrgID int, 
    @UserID int = NULL, 
    @BaseDate smalldatetime = NULL, 
    @Debug tinyint = 0 
AS 
BEGIN 
    SET NOCOUNT ON 
    DECLARE @Error    int 
    DECLARE @RowCount   int 
    BEGIN TRY 
    IF (@debug = 1) PRINT '---- START Assessment.RefreshUP ----' 
    (snip) 

在某些情况下,还喜欢使用的RAISERROR,因为它允许你将多个参数传递喜欢的方式String.Format()作品.NET。

RAISERROR...WITH NOWAIT

+0

谢谢Lankymart。我怀疑添加调试参数可能是“最佳解决方法”解决方案。我很惊讶我没有能够谷歌其他人对这个问题的经验,也没有发现任何明确指出PRINT或RAISERROR语句不能使用的文档。 –

相关问题