套用到
SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Standard

Microsoft 將 Microsoft SQL Server 2012 的修補程式以一個可下載檔案形式發佈。 由於修補是累積性的,每個新版本都包含了先前 SQL Server 2012 更新版本中包含的所有熱修補與安全更新。

徵兆

請試想下列案例:

  • 你在 2012 SQL Server Microsoft 建立一個儲存程序,使用一個 table-valued 參數 (TVP) 。

  • 你可以使用 SQL Profiler 或 SQL Server 擴展事件來擷取 RPC:Starting 和 RPC:Completed 事件。

  • 你執行一個使用 TVP 的查詢。

  • 查詢會逾時。

此情境下,會發生非 yield 排程器錯誤,且在同一排程器上執行的查詢會執行緩慢。 此外,SQL Server 日誌資料夾中會產生一個迷你傾印檔案。當此問題發生時,您會收到類似以下錯誤訊息的訊息:

System.Data.SqlClient.SqlException (0x80131904) : timeout expired. 逾時時間在操作完成前已過,或伺服器未回應。at System.Data.SqlClient.SqlInternalConnection.OnError (SqlException exception, Boolean breakConnection) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning () at System.Data.SqlClient.TdsParserStateObject.ReadSniError (TdsParserStateObject stateObj, UInt32 error) at System.Data.SqlClient.TdsParserStateObject.ReadSni (DbAsyncResult asyncResult, tdsParserStateObject stateObj) atSystem.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket () at System.Data.SqlClient.TdsParserStateObject.ReadByte () at 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 method, DbAsyncResult) at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery (DbAsyncResult result, String methodName, Boolean sendToPipe) at System.Data.SqlClient.SqlCommand.ExecuteNonQuery () at TVPApp.Program.Main (String[] args)

非排程錯誤連同類似以下錯誤訊息,會記錄在 SQL Server 錯誤日誌中:

<日期><時間> 伺服器使用「dbghelp.dll」版本 '4.0.5'<日期><時間> 伺服器 ***無法取得 spid 的執行緒上下文 #<日期><時間> 伺服器 * *******************************************************************************><2 日期><時間> 伺服器 *><6 日期><時間> 伺服器 * 開始堆疊傾印:><0 日期><時間> 伺服器 * <日期><時間> spid #><8 日期><時間> 伺服器 *><2 伺服器> 日期><時間 * 不穩定排程器><6 日期><時間> 伺服器 *<日期><時間> 伺服器 * *******************************************************************************<日期><時間> 伺服器堆疊簽章 0x000000000000002C<日期><時間> 伺服器外部傾印過程回傳碼 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(使用 SQL Profiler 或 SQL Server Extended Events 時)執行使用 TVP 的查詢時,會出現無法產生排程錯誤

解決方案

累積更新資訊

2012 服務包 1 SQL Server SP1 SP1) 的累積更新包 5 (

這個問題的修正最早是在累積更新 5 中釋出的。 欲了解更多如何取得 SQL Server 2012 累積更新套件的資訊,請點擊以下文章編號以瀏覽 Microsoft 知識庫中的文章:

2861107 SQL Server 2012 累積更新套件 5 備註:由於建置是累積式的,每個新修正版本都包含了先前 SQL Server 2012 修正版本中包含的所有熱修正與安全修正。 我們建議您考慮套用包含此熱修正的最新修正版本。 如需詳細資訊,請按一下下面的文章編號,檢視「Microsoft 知識庫」中的文章:

2772858 SQL Server 2012 版本是在 SQL Server 2012 服務包 1 發布之後釋出的

因應措施 

若要解決這個問題,請使用下列其中一個方法:

  • 請勿使用 SQL Profiler 或 SQL Server Extended Events。

  • 點擊以清除追蹤定義中的 RPC:Starting 與 RPC:Completed(完成)勾選框。

狀態

Microsoft 已確認<適用於>一節所列的 Microsoft 產品確實有上述問題。

需要更多協助嗎?

想要其他選項嗎?

探索訂閱權益、瀏覽訓練課程、瞭解如何保護您的裝置等等。