Sql server Microsoft SQL Server本机客户端被打印语句破坏

Sql server Microsoft SQL Server本机客户端被打印语句破坏,sql-server,stored-procedures,asp-classic,Sql Server,Stored Procedures,Asp Classic,我正在使用“Microsoft SQL Server Native Client 11.0”从经典ASP调用SQL Server存储过程。我这么做已经很多年了。我刚刚开发了一个存储过程,它利用PRINT语句在开发期间以及从MSMS调用时提供信息性消息。但是,当我通过SQL Server本机客户端从Classic ASP调用相同的存储过程时,我得到一个0x80040e14错误,错误代码中出现了第一条PRINT语句的文本 我在谷歌上搜索过这个问题,但是找不到任何地方它说你不能这样做,所以我想知道我是

我正在使用“Microsoft SQL Server Native Client 11.0”从经典ASP调用SQL Server存储过程。我这么做已经很多年了。我刚刚开发了一个存储过程,它利用PRINT语句在开发期间以及从MSMS调用时提供信息性消息。但是,当我通过SQL Server本机客户端从Classic ASP调用相同的存储过程时,我得到一个0x80040e14错误,错误代码中出现了第一条PRINT语句的文本

我在谷歌上搜索过这个问题,但是找不到任何地方它说你不能这样做,所以我想知道我是否遗漏了一个技巧。有谁能给我指出我不能包含打印语句(boo!)的证据,或者我在做傻事吗

例外情况:

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)
中第71行第3列的未处理异常 http://localhost:3000/DataAccess/Workpalces.asp

0x80040e14-Microsoft SQL Server本机客户端11.0:----启动评估。刷新----

我的(节略)存储过程:

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调用:

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)
”评估。刷新
' ========================
'创建或更新工作区
功能评估\u更新(rs、组织ID、用户ID)
停止
Dim命令
Set cmd=Server.CreateObject(“ADODB.Command”)
Set rs=Server.CreateObject(“ADODB.Recordset”)
cmd.ActiveConnection=DBConnString
cmd.CommandType=adCmdStoredProc
cmd.CommandText=“评估。刷新”
cmd.Parameters.Append cmd.CreateParameter(“@OrgID”,adInteger,adParamInput,0,OrganizationId)
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
设置rs.ActiveConnection=Nothing
Set cmd=Nothing
端函数

PRINT
语句对于调试非常有用,但遇到这些问题后,我发现在存储过程中使用一个额外的参数,例如
@debug TINYINT=0
,对于默认情况下不显示
PRINT
语句或任何类型的调试输出都很有用,但允许您在需要调试过程时打开它

创建过程评估。刷新
@OrgID int,
@UserID int=NULL,
@BaseDate smalldatetime=NULL,
@调试tinyint=0
作为
开始
不计较
声明@Error int
声明@rowcountint
开始尝试
如果(@debug=1)打印'--START Assessment.RefreshUP'--'
(剪报)
在某些情况下,您也更喜欢使用
RAISERROR
,因为它允许您传递多个参数,就像
String.Format()
在.Net中的工作方式一样


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

在我的例子中,问题是调用存储过程中不存在的用户定义函数(UDF)。但是,PRINT语句的存在影响了异常“text”,并使我走上了错误的道路

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


如果遇到问题,请尝试直接从MSSM调用存储过程,最好使用从SQL事件探查器捕获的SQL来确定问题的真正来源

谢谢兰克马特。我怀疑添加调试参数可能是“最佳解决方案”。我只是很惊讶,我没有能够搜索到其他人对这个问题的体验,也没有发现任何文档清楚地表明不能使用PRINT或RAISERROR语句。你能发布完整的存储过程吗,感觉到你的
打印
不是问题所在。当错误代码引用字符串后的
未关闭引号时,它出现在异常发生之后。由于您的
PRINT
语句输出怀疑这是问题所在。我怀疑您是对的,因为我刚刚偶然发现了另一个ASP/存储过程调用,该调用中包含PRINT语句,但不影响它们。我应该编辑我原来的帖子还是在评论中添加完整的存储过程?只需编辑你现有的帖子扩展你的存储过程代码,你可以在帖子底部留下一个编辑,说你已经更新了,但老实说,人们会知道的。;)好啊异常中的消息文本是一个模糊的信息:我已经将@debug参数设置回1,它仍然有效。但是,通过引用存储过程中不存在的用户定义函数,我能够重新创建问题(包括异常中的错误消息文本):在回答之前,我应该更加关注您的帖子,很高兴您能够修复它。