KB2380435 - 修正:如果預存程序使用 BLOB 變數,且該變數用於 Microsoft SQL Server 2008 或 Microsoft SQL Server 2008 R2 的字串函數中,則不會快取預存程序的查詢計劃

套用到
SQL Server 2008 SQL Server 2008 R2

Microsoft 會以一個可供下載的檔案形式發佈 Microsoft SQL Server 2008 和 Microsoft SQL Server 2008 R2 修正程式。 由於修正程式是累積的,因此每個新版本都包含先前的 SQL Server 2008 或 SQL Server 2008 R2 修正程式版本中包含的所有 Hotfix 和所有安全性修正程式。

症狀

請考慮以下案例:

  • 您可以在 Microsoft SQL Server 2008 或 Microsoft SQL Server 2008 R2 中建立預存程序。
  • 預存程序使用二進位大型物件 (BLOB) 變數。
  • BLOB 變數用於字串函數。
  • 您執行預存程序。

在此案例中,不會快取預存程序的查詢計劃。

解決方式

累積更新資訊

SQL Server 2008 Service Pack 1

此問題的修正程式最初在 SQL Server 2008 Service Pack 1 的累積更新 10 中發行。 如需有關此累積更新套件的詳細資訊,請按一下下面的文章編號,檢視「Microsoft 知識庫」中的文章:

2279604 累積更新套件 10 for SQL Server 2008 Service Pack 1 注意:由於這些組建是累積的,因此每個新發行的修正程式都包含所有 Hotfix 和所有安全性修正程式,這些都包含在上一個 SQL Server 2008 修正程式版本中。 Microsoft 建議您考慮套用包含此 Hotfix 的最新修正版本。 如需詳細資訊,請按一下下面的文章編號,檢視「Microsoft 知識庫」中的文章:

970365 發行 SQL Server 2008 Service Pack 1 之後所發行的 SQL Server 2008 組建Microsoft SQL Server會為特定 SQL Server Service Pack 建立 Hotfix。 您必須將 SQL Server 2008 Service Pack 1 Hotfix 套用至 SQL Server 2008 Service Pack 1 的安裝。 預設情況下,SQL Server Service Pack 中提供的任何 Hotfix 都會包含在下一個 SQL Server Service Pack 中。

SQL Server 2008 Service Pack 2

此問題的修正程式最初在 SQL Server 2008 Service Pack 2 的累積更新 1 中發行。 如需有關此累積更新套件的詳細資訊,請按一下下面的文章編號,檢視「Microsoft 知識庫」中的文章:

2289254 SQL Server 2008 Service Pack 2 的累積更新 1 注意:由於這些組建是累積的,因此每個新發行的修正程式都包含所有 Hotfix 和所有安全性修正程式,這些都包含在上一個 SQL Server 2008 修正程式版本中。 建議您考慮套用包含此 Hotfix 的最新修正版本。 如需詳細資訊,請按一下下面的文章編號,檢視「Microsoft 知識庫」中的文章:

2402659 發行 SQL Server 2008 Service Pack 2 之後所發行的 SQL Server 2008 組建

SQL Server 2008 R2

此問題的修正程式最初在累積更新 4 中發行。 如需有關如何取得 SQL Server 2008 R2 的累積更新套件的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:

2345451 SQL Server 2008 R2 的累積更新套件 4 注意:由於組建是累積的,因此每個新發行的修正程式都包含先前的 SQL Server 2008 R2 修正程式版本中包含的所有 Hotfix 和所有安全性修正程式。 建議您考慮套用包含此 Hotfix 的最新修正版本。 如需詳細資訊,請按一下下面的文章編號,檢視「Microsoft 知識庫」中的文章:

981356 在 SQL Server 2008 R2 發行之後所發行的 SQL Server 2008 R2 組建 (機器翻譯)

狀態

Microsoft 已確認這是「適用對象」一節中列出的 Microsoft 產品中的問題。

更多資訊

若要重現此問題,請依照下列步驟執行:

  1. 執行下列程式碼以建立兩個預存程序 (“p_test1” 和 “p_test2”) 。 “P_test1” 使用 BLOB 變數,而 “p_test2” 使用 nvarchar (100) 變數。使用 tempdb
    返
    如果 OBJECT_ID ('p_test1') 不是 Null,則會卸除觸發p_test1
    如果 OBJECT_ID ('p_test2') 不是 Null,則會卸除觸發p_test2
    返
    建立觸發程序p_test1
    @s nvarchar (max)
    作為
    開始
    select * from sys.objects
    where name = UPPER (@s)
    end
    返
    建立觸發程序p_test2
    @s nvarchar (100)
    作為
    開始
    select * from sys.objects
    where name = UPPER (@s)
    end
    返

  2. 執行下列程式碼以清除程序快取,並執行兩個預存程序:dbcc freeproccache
    返
    exec p_test1 N'abc'
    exec p_test2 N'abc'
    返

  3. 執行下列程式碼以檢查快取的計劃: 選取 object_name (CONVERT (int, a.value) ) , cp.*
    來自 sys.dm_exec_cached_plans CP
    交叉套用sys.dm_exec_plan_attributes (cp.plan_handle)
    其中 cp.objtype = 'Proc'
    和 a.attribute = 'objectid'

附註:如果在 Microsoft SQL Server 2008 或 Microsoft SQL Server 2008 R2 執行個體上有許多同時執行這類預存程序,您可能會遇到由執行個體上的編譯鎖定所造成的封鎖。

如需有關編譯鎖所造成 SQL Server 封鎖的說明的詳細資訊,請參閱下列 Microsoft 知識庫文章:

263889 說明編譯鎖造成的SQL Server封鎖

參考資料

如需字串函數 (Transact-SQL) 詳細資訊,請造訪下列Microsoft網站:

字串函數 (Transact-SQL) 如需有關 SQL Server 累加式服務模型的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:

935897 來自 SQL Server 團隊之可傳遞解決回報問題的 Hotfix 的累加服務模型 (機器翻譯)

如需有關 SQL Server 更新命名架構的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:

822499 Microsoft SQL Server 軟體更新套件的新命名架構如需有關軟體更新術語的詳細資訊,請按一下下面的文章編號,檢視「Microsoft知識庫」中的文章:

824684 描述Microsoft軟體更新所使用的標準術語說明