首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Microsoft SQL Server本机客户端受PRINT语句破坏

问Microsoft SQL Server本机客户端受PRINT语句破坏
EN

Stack Overflow用户
提问于 2014-03-12 09:56:39
回答 2查看 457关注 0票数 1

我使用"Microsoft本机客户端11.0“从经典ASP调用Server存储过程。我这么做已经好几年了。我刚刚开发了一个存储过程,它使用PRINT语句在开发期间以及从MSSMS调用时提供信息信息。但是,当我通过SQL Server本机客户端从Classic调用相同的存储过程时,在错误代码中出现的第一个PRINT语句中的文本会出现0x80040e14错误。

我在谷歌上搜索过这个问题,但在哪里都找不到它说你不能这么做的地方,所以我想知道我是不是错过了一个窍门。谁能给我指出我不能包括打印声明的证据(嘘!)还是我在做傻事?

异常:

http ://localhost:3000/DataAccess/Workpalces.asp中第71行第3列中未处理的异常 0x80040e14 - Microsoft本机客户端11.0:

My (简写)存储过程:

代码语言:javascript
复制
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调用:

代码语言:javascript
复制
' 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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-12 11:42:22

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

在我的例子中,问题是对存储过程中不存在的用户定义函数(UDF)的调用。然而,打印语句的存在影响了异常“文本”,并导致我走错了道路。

可以在存储过程中使用打印语句,这些语句是从经典ASP / Server本机客户端调用的。

如果遇到问题,请尝试直接从MSSMS调用存储过程,最好使用从source捕获的SQL来确定问题的真正来源。

票数 1
EN

Stack Overflow用户

发布于 2014-03-12 10:06:46

PRINT语句对于调试非常有用,但是遇到这些问题后,我发现在存储过程中增加一个类似于@debug TINYINT = 0的参数对于在默认情况下不显示PRINT语句或调试输出很有用,但允许您在想调试过程时打开它。

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22347765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档