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

错误 #: 187868 (内容维护)VSTS: 1340145

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

症状

请考虑以下情形:

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

  • 使用 SQL 事件探查器或 SQL Server 扩展事件以捕获RPC︰ 启动和RPC︰ 完成事件。

  • 运行该查询使用 TVP。

  • 查询超时。

在这种情况下,发生了无产出计划程序错误,和相同的计划程序运行的查询运行速度很慢。此外,SQL Server 日志文件夹中生成一个小型转储文件。发生此问题时,您将收到类似于以下内容的错误消息︰

System.Data.SqlClient.SqlException (0x80131904): 超时已过期。在操作完成之前已超时或服务器没有响应。在 System.Data.SqlClient.SqlInternalConnection.OnError (sqlexception︰ 异常、 布尔型 breakConnection)在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()在 System.Data.SqlClient.TdsParserStateObject.ReadSniError (TdsParserStateObject stateObj,UInt32 错误)在 System.Data.SqlClient.TdsParserStateObject.ReadSni (DbAsyncResult asyncResult,TdsParserStateObject stateObj)在 System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket()在 System.Data.SqlClient.TdsParserStateObject.ReadByte()在 System.Data.SqlClient.TdsParser.Run (RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader 数据流,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj)在 System.Data.SqlClient.SqlCommand.FinishExecuteReader (SqlDataReader ds、 RunBehavior runBehavior、 字符串 resetOptionsString)在 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds 下 cmdBehavior、 RunBehavior runBehavior、 布尔型 returnStream (布尔型异步)在 System.Data.SqlClient.SqlCommand.RunExecuteReader 下 cmdBehavior、 RunBehavior runBehavior、 returnStream 的 boolean 类型的值 (字符串方法,DbAsyncResult 结果)在 System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery (DbAsyncResult 结果、 方法名称的字符串、 布尔型 sendToPipe)在 System.Data.SqlClient.SqlCommand.ExecuteNonQuery()在 TVPApp.Program.Main (就)

在 SQL Server 错误日志中记录类似于以下内容的错误消息以及无产出计划程序错误︰

< 日期 >< 时间 > 服务器使用 dbghelp.dll 版本"4.0.5"< 日期 >< 时间 > 服务器 *** 无法获取线程上下文的 spid #<Date><Time> Server * *******************************************************************************< 日期 >< 时间 > 服务器 *< 日期 >< 时间 > 服务器 * 开始堆栈转储︰< 日期 >< 时间 > 服务器 * < 日期 >< 时间 > spid #< 日期 >< 时间 > 服务器 *< 日期 >< 时间 > 服务器 * 无产出计划程序< 日期 >< 时间 > 服务器 *<Date><Time> Server * *******************************************************************************转储的 < 日期 >< 时间 > 服务器堆栈签名是 0x000000000000002C< 日期 >< 时间 > 服务器外部转储过程返回代码 0x20000001。外部的转储进程返回的任何错误。< 日期 >< 时间 > 服务器进程 0:0:0 (0x1670) 工作人员 0x0000000004EDE160 看起来无产出计划 5。线程创建时间︰ 13014210386757。约线程 CPU 使用︰ 用户 70106 女士的处理器利用率内核 0 毫秒,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 扩展事件

解决方案

累积更新信息

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

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

2861107累计更新 SQL Server 2012年包 5注意:因为版本具有累积性,所以每个新修补程序版本包含的所有修补程序和所有安全修复程序都包含上一个 SQL Server 2012 的修补程序版本。我们建议您考虑将应用包含此修复程序的最新的修补程序版本。有关详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

SQL Server 2012年生成 SQL Server 2012 Service Pack 1 发布后发布的2772858

解决方法

要解决此问题,请使用下列方法之一︰

  • 不要使用 SQL 事件探查器或 SQL Server 扩展事件。

  • 单击以清除RPC︰ 启动和RPC︰ 完成跟踪定义中的复选框。

详细信息

此修复程序不适用于 SQL Server 2008年或 SQL Server 2008 R2 发布此知识库文章时。如果任何用户遇到 SQL Server 2008年或 SQL Server 2008 R2 中的同一问题,即使在用户应用以下文章中介绍的包,验证是否使用查询超时,并确定是否可以解决超时。否则,提交一个请求,以将此修复程序应用到 SQL Server 2008年或 SQL Server 2008 R2。

2520808解决︰ 当查询运行时计划程序未转交错误使用 SQL Server 2008年中或在 SQL Server 2008 R2 TVP 如果使用 SQL 事件探查器或 SQL Server 扩展事件

调用堆栈信息

sqlmin!CLinkedMap<__int64,CCheckReadersAndWriters::CCounts>::FLookup+0x29sqlmin!CCheckReadersAndWriters::Release+0x69sqlmin!CMainIlb::{dtor}+0x3dsqlmin!CMainIlb::`scalar deleting destructor'+0x3dsqlmin!CBlobHandleFactoryMain::ReleaseILockBytes+0x13sqlmin!CMainIlb::Release+0xf0sqllang!CTraceRpcBinaryStream::~CTraceRpcBinaryStream+0x80sqllang!CTraceTvpData::{dtor}+0x14sqllang!CTraceTvpData::`scalar deleting destructor'+0x1esqllang!CRpcTraceHelper::CleanUpTraceTvpData+0x33sqllang!CRpcTraceHelper::~CRpcTraceHelper+0x70sqllang!CRPCExecEnv::~CRPCExecEnv+0x2absqllang!CRPCExecEnv::`scalar deleting destructor'+0x14sqllang!process_request+0x10b1sqllang!process_commands+0x51csqldk!SOS_Task::Param::Execute+0x21esqldk!SOS_Scheduler::RunTask+0xa8sqldk!SOS_Scheduler::ProcessTasks+0x299sqldk!SchedulerManager::WorkerEntryPoint+0x261sqldk!SystemThread::RunWorker+0x8fsqldk!SystemThreadDispatcher::ProcessWorker+0x3c8sqldk!SchedulerManager::ThreadEntryPoint+0x236kernel32!BaseThreadInitThunk+0xdntdll!RtlUserThreadStart+0x1d  
sqlmin!CLinkedMap<__int64,CCheckReadersAndWriters::CCounts>::FDelete+0x34sqlmin!CCheckReadersAndWriters::Release+0xfbsqlmin!CMainIlb::{dtor}+0x3dsqlmin!CMainIlb::`scalar deleting destructor'+0x3dsqlmin!CBlobHandleFactoryMain::ReleaseILockBytes+0x13sqlmin!CMainIlb::Release+0xf0sqllang!CTraceRpcBinaryStream::~CTraceRpcBinaryStream+0x80sqllang!CTraceTvpData::{dtor}+0x11sqllang!CRpcTraceHelper::CleanUpTraceTvpData+0x55sqllang!CRpcTraceHelper::TracePostExec+0x1bfsqllang!CRPCExecEnv::OnExecFinish+0xaasqllang!CProtocolHeaderInfo::{dtor}+0xffffffff`ffb158e2sqllang!process_request+0x764sqllang!process_commands+0x51csqldk!SOS_Task::Param::Execute+0x21esqldk!SOS_Scheduler::RunTask+0xa8sqldk!SOS_Scheduler::ProcessTasks+0x29asqldk!SchedulerManager::WorkerEntryPoint+0x261sqldk!SystemThread::RunWorker+0x8fsqldk!SystemThreadDispatcher::ProcessWorker+0x3c8sqldk!SchedulerManager::ThreadEntryPoint+0x236kernel32!BaseThreadInitThunk+0x1antdll!RtlUserThreadStart+0x1d 

状态

Microsoft 已经确认这是“适用于”一节中列出的 Microsoft 产品中的问题。

Author: jannawWriter: v-yipli技术审阅︰ pradm; jannaw; hozhanEditor: v-mordew

需要更多帮助?

需要更多选项?

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