Microsoft SQL Server Native Client由PRINT语句破坏

时间:2014-03-12 09:56:39

标签: sql-server stored-procedures asp-classic

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

我已经搜索过该问题,但无法找到它说你无法做到的任何地方,所以我想知道我是否在某个地方错过了一个技巧。任何人都能指出我不能包含PRINT语句的证据(嘘!)或者我是否在做傻事?

例外:

  

第71行第3行的未处理异常   http:// localhost:3000 / DataAccess / Workpalces.asp

     

0x80040e14 - Microsoft SQL Server Native Client 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

1 个答案:

答案 0 :(得分:1)

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

就我而言,问题是在存储过程中进一步向下调用用户定义函数(UDF)并不存在。但是,PRINT语句的存在已经影响了Exception" text"并把我带到了错误的道路上。

您可以在存储过程中使用PRINT语句,这些语句是从Classic ASP / SQL Server Native Client调用的。

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