【问题标题】:SQL Server PRINT statement in stored procedure is being concatenated with RAISERROR message by System.Data.SqlClientSystem.Data.SqlClient 将存储过程中的 SQL Server PRINT 语句与 RAISERROR 消息连接起来
【发布时间】:2021-02-13 06:19:04
【问题描述】:

我相当简单的存储过程在第 44 行执行此操作:

IF @a = @b
    RAISERROR('blah blah blah', 11, 1)
    RETURN

使用 .NET Framework System.Data.SqlClient 库在客户端调用存储过程:

   try
   {
        SqlCommand c = new SqlCommand();
        c.CommandType = CommandType.StoredProcedure;
        c.CommandText = "procname";
        c.ExecuteNonQuery()   // execute the stored procedure 
   }
   catch(SqlException sex)
       throw sex;
   catch(Exception ex)
   {
        throw ex;
   }

ex被捕获时,其值为blah blah blah + CRLF + 1259

1259 来自哪里?是否对应严重性 11?

【问题讨论】:

  • 仅供参考,你真的应该使用THROW,而不是RAISERROR
  • @Larnu:旧版 SP,它早于 THROW。
  • @Larnu。我没有使用不受支持的 SQL Server 版本。我使用的是 SQL Server 2017,但该应用程序的许多 SP 可以追溯到几年前。
  • 改为捕获SqlException。它有一个具有更精细细节的Errors 属性。

标签: sql-server sql-server-2017 raiserror system.data.sqlclient


【解决方案1】:

啊哈!刚找到。在 RAISERROR 上方的几行中有一个 PRINT 语句。不知道(不相关的)PRINT 语句会附加到错误消息中!

  PRINT 'Fee fie fo fum'

  <snip>

  if @a = @b
     RAISERROR('blah blah blah', 11, 1)
     return

客户端的 SqlException Message 属性为 "blah blah blah" + CRLF + "Fee fie fo fum"

【讨论】:

  • " 不知道(不相关的)PRINT 语句会附加到错误消息中!" 他们不知道。
  • 确实如此。我将其更改为“PRINT 'Fee fie fo fum'”,现在我的错误消息客户端显示为blah blah blah + CRLF + fee fie fo fum。必须是System.Data.SqlClient 功能。
  • SqlException 的行为相同。
  • 数据库引擎将PRINTRAISERRORTHROW 生成的所有消息连同信息、警告、错误和API 消息一起返回给客户端。区别在于,严重性为 11 或更高 (SqlError.Class >= 11) 的错误也会引发 SqlClient 和大多数其他 API 的异常。不过,SqlException.Errors 集合将包含所有消息,因此您需要过滤 Class 以丢弃信息和警告消息。
  • 谢谢@Dan Guzman。我以前从未在 PRINT 和 RAISERROR 和 System.Data.SqlClient 遇到过这种行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多