应用对象
SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Standard

Microsoft将Microsoft SQL Server 2012 修补程序分发到一个可下载文件中。 由于修补程序是累积的,因此每个新版本都包含上一个SQL Server 2012 更新版本中包含的所有修补程序和所有安全更新。

症状

请考虑以下情况:

  • 在 Microsoft SQL Server 2012 中创建使用表值参数 (TVP) 的存储过程。

  • 使用 SQL 探查器或SQL Server扩展事件来捕获 RPC:Starting 和 RPC:Completed 事件。

  • 运行使用 TVP 的查询。

  • 查询超时。

在此方案中,将发生非生成计划程序错误,并且在同一计划程序上运行的查询运行缓慢。 此外,会在 SQL Server 日志文件夹中生成一个微型转储文件。发生此问题时,将收到类似于以下内容的错误消息:

System.Data.SqlClient.SqlException (0x80131904) :超时已过期。 操作完成之前已过的超时期限或服务器未响应。at System.Data.SqlClient.SqlInternalConnection.OnError (SqlException 异常,) System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning () at System.Data.SqlClient.TdsParserStateObject.ReadSniError (TdsParserStateObject stateObj, 在 System.Data.SqlClient.TdsParserStateObject.ReadSni (DbAsyncResult asyncResult、TdsParserStateObject stateObject) at 处) UInt32 错误System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket () 在 System.Data.SqlClient.TdsParserStateObject.ReadByte () system.Data.SqlClient.TdsParser.Run (RunBehavior runBehavior, SqlCommand cmdHandler、SqlDataReader dataStream、BulkCopySimpleResultSet bulkCopyHandler、TdsParserStateObject stateObj) at System.Data.SqlClient.SqlCommand.FinishExecuteReader (SqlDataReader ds、RunBehavior runBehavior、String resetOptionsString) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior cmdBehavior、RunBehavior runBehavior、Boolean returnStream、Boolean async) at System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior、Boolean returnStream、String 方法、DbAsyncResult 结果) :System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery (DbAsyncResult result、String 方法Name、Boolean sendToPipe) at System.Data.SqlClient.SqlCommand.ExecuteNonQuery () at TVPApp.Program.Main (String[] args)

未生成计划程序错误以及类似于以下内容的错误消息记录在SQL Server错误日志中:

<日期><时间> 服务器使用“dbghelp.dll”版本“4.0.5”<日期><时间> 服务器 ***无法获取 spid #<Date><Time> Server 的线程上下文 * *******************************************************************************><2 ******************************************************************************* ******************************************************************************* Date><Time> Server *><6 Date><Time> Server * BEGIN STACK DUMP:><0 Date><Time> Server * <Date><Time> spid #><8 Date><Time> Server *><2 Date><Time> Server * non-yielding Scheduler><6 Date><Time> Server *<Date><Time> Server * *******************************************************************************<Date><Time> Server Stack Signature 0x000000000000002C<Date><Time> Server External dump process return code 0x20000001。外部转储进程未返回任何错误。<日期><时间> 服务器进程 0:0:0 (0x1670) 辅助角色0x0000000004EDE160在计划程序 5 上似乎没有生成。 线程创建时间:13014210386757。 已用线程 CPU 近似值:内核 0 毫秒,用户 70106 毫秒。 进程利用率 16%。 系统空闲 77%。 间隔:70140 毫秒。<日期><时间> 服务器进程 0:0:0 (0x1670) 辅助角色0x0000000004EDE160在计划程序 5 上似乎没有生成。 线程创建时间:

原因

出现此问题的原因是 SQL Server 2012 数据库引擎中的错误。 TVP 中的文本列实现为插入字符串或缓冲区,行数增加会增加缓冲区数。 但是,释放缓冲区的过程非常耗时。 因此,发生释放和收缩操作时,将生成无收益计划程序错误。 注意 以下Microsoft知识库文章中也解决了类似问题。 但是,本文中所述的累积更新包不适用于查询超时问题。

2520808 修复:如果在 SQL Server 2008 或 SQL Server 2008 R2 中运行使用 TVP 的查询,则使用 SQL 探查器或SQL Server扩展事件,则运行未生成计划程序错误

解决方法

累积更新信息

SQL Server 2012 Service Pack 1 (SP1 的累积更新包 5)

此问题的修补程序首次在累积更新 5 中发布。 有关如何为 SQL Server 2012 获取此累积更新包的详细信息,请单击以下编号以查看Microsoft知识库中的文章:

2861107 SQL Server 2012 的累积更新包 5 注意 由于内部版本是累积的,因此每个新修补程序版本都包含上一个SQL Server 2012 修补程序版本中包含的所有修补程序和所有安全修补程序。 建议考虑应用包含此修补程序的最新修补程序版本。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

2772858 SQL Server 2012 Service Pack 1 发布后发布的SQL Server 2012 版本

解决方法

若要解决此问题,请使用以下某种方法:

  • 请勿使用 SQL Profiler 或SQL Server扩展事件。

  • 单击以清除跟踪定义中的 RPC:Starting 和 RPC:Completed 检查框。

状态

Microsoft 已经确认这是一个列于“适用范围”部分的 Microsoft 产品问题。

需要更多帮助?

需要更多选项?

了解订阅权益、浏览培训课程、了解如何保护设备等。