當使用 LOB 數據類型的連結伺服器查詢遇到例外狀況時,SQL Server 會產生判斷提示傾印檔案

本文可協助您解決導致 Microsoft SQL Server 產生資產傾印檔案和 SQL Server 服務變得沒有回應的問題。

徵兆

試想以下情況:

  • SQL Server 會產生判斷提示傾印檔案。 這會導致 SQL Server 服務變得沒有回應。

  • 在 SQL Server 錯誤記錄檔中,您會觀察下列判斷提示表示式: pilb->m_cRef == 0。 如需判斷提示以及如何進行疑難解答的詳細資訊,請參閱 MSSQLSERVER_3624 - SQL Server

    2023-03-14 06:12:44.83 spid54 * 位置:memilb.cpp:1836 2023-03-14 06:12:44.83 spid54 * 表達式: pilb-m_cRef> == 0

  • SQL Server 在傾印檔案程式期間變得沒有回應。

原因

以下是產生 SQL Server 傾印檔案時可能會影響的一些條件:

  • 遠端查詢是使用 EXEC AT 命令來執行。 例如:

    DECLARE @test NVARCHAR(MAX) = N'ABC'
    EXEC ('SELECT * FROM Customers.dbo.CustomerInformation WHERE CustomerId = ?', @test) AT [YourRemoteServer];
    
  • 大型物件 (LOB) 自變數會傳遞至查詢。 如需 LOB 數據類型的詳細資訊,請參閱 數據類型 (Transact-SQL) - SQL Server

在上一個範例中, NVARCHAR(MAX) 變數會以查詢參數的形式傳遞。 提交至連結伺服器的基礎要求之一會失敗。

您也可以執行下列查詢來重現問題:

DECLARE @test NVARCHAR(MAX) = N'msdb' 
EXEC ('---SELECT * FROM sys.databases where name = ?', @test) AT [<server>\<instance>]

若要避免此問題,請在資料庫設計或程式代碼中使用 nonblob (BLOB) 資料類型:

DECLARE @test NVARCHAR(5) = N'msdb' 
EXEC ('---SELECT * FROM sys.databases where name = ?', @test) AT  [<server>\<instance>]

警告

如果您在環境中執行此程式碼,您可能會遇到會導致中斷的傾印檔案。 自行執行。

狀態

Microsoft仍在調查此問題,以找出長期修正。 在修正程式可用之前,您可以嘗試下一節中提供的因應措施。

因應措施

若要解決此問題,請將所有 LOB (Large Object) 數據類型變更為輸入數據長度支援的固定長度數據類型。 例如,轉換為 NVARCHAR(MAX) NVARCHAR(200))