Update: Abfrageplan für eine gespeicherte Prozedur wird nicht zwischengespeichert werden, wenn die gespeicherte Prozedur eine BLOB-Variable verwendet und die Variable in einer Zeichenfolge in Microsoft SQL Server 2008 oder Microsoft SQL Server 2008 R2 wird

Gilt für: SQL Server 2008SQL Server 2008 R2

Microsoft stellt Updates für Microsoft SQL Server 2008 und Microsoft SQL Server 2008 R2 als downloadbare Dateien zur Verfügung. Da die kumulativ sind, enthält jede neue Version alle Hotfixes und alle Sicherheitsupdates, die in früheren SQL Server 2008 oder SQL Server 2008 R2 enthalten waren.

Problembeschreibung


Stellen Sie sich folgendes Szenario vor:
  • Sie erstellen eine gespeicherte Prozedur in Microsoft SQL Server 2008 oder Microsoft SQL Server 2008 R2.
  • Die gespeicherte Prozedur verwendet eine Variable großes Binärobjekt (BLOB).
  • BLOB-Variable wird in einer Zeichenfolge verwendet.
  • Die gespeicherte Prozedur ausführen.
In diesem Szenario wird der Abfrageplan für die gespeicherte Prozedur nicht zwischengespeichert.

Lösung


Informationen zum kumulativen Update

SQL Server 2008 Servicepack 1

Die Fehlerbehebung für dieses Problem wurde zuerst im Kumulatives Update 10 für SQL Server 2008 Service Pack 1 veröffentlicht. Für weitere Informationen zu diesem kumulativen Update-Paket, klicken Sie auf die folgende Artikelnummer, um den Artikel in der Microsoft Knowledge Base anzuzeigen:
2279604 Kumulatives Updatepaket 10 für SQL Server 2008 Service Pack 1
Hinweis Da diese Builds kumulativ sind, enthält jede neue Veröffentlichung alle Hotfixes und alle die Sicherheitsupdates, die in den vorherigen SQL Server 2008 Fix-Veröffentlichung enthalten waren. Microsoft empfiehlt, dass Sie prüfen die neueste Update-Version, die diesen Hotfix enthält. Weitere Informationen finden Sie im folgenden Artikel der Microsoft Knowledge Base:
970365 SQL Server 2008 builds, die nach der Freigabe von SQL Server 2008 Service Pack 1
Microsoft SQL Server 2008-Hotfixes sind für bestimmte SQL Server Servicepacks erstellt. Sie müssen SQL Server 2008 Service Pack 1-Hotfix eine Installation von SQL Server 2008 Service Pack 1 anwenden. Standardmäßig ist jeder Hotfix, der in einem SQL Server Servicepack bereitgestellt wird, in einem nächsten Servicepack für SQL Server enthalten.

SQL Server 2008 Servicepack 2

Die Fehlerbehebung für dieses Problem wurde zuerst im kumulativen Update 1 für SQL Server 2008 Service Pack 2 veröffentlicht. Für weitere Informationen zu diesem kumulativen Update-Paket, klicken Sie auf die folgende Artikelnummer, um den Artikel in der Microsoft Knowledge Base anzuzeigen:
2289254 Kumulative Update 1 für SQL Server 2008 Service Pack 2
Hinweis Da diese Builds kumulativ sind, enthält jede neue Veröffentlichung alle Hotfixes und alle die Sicherheitsupdates, die in den vorherigen SQL Server 2008 Fix-Veröffentlichung enthalten waren. Wir empfehlen Sie prüfen die neueste Update-Version, die diesen Hotfix enthält. Weitere Informationen finden Sie im folgenden Artikel der Microsoft Knowledge Base:
2402659 SQL Server 2008 basiert, die nach der Freigabe von SQL Server 2008 Service Pack 2 veröffentlicht wurden

SQL Server 2008 R2

Die Fehlerbehebung für dieses Problem wurde erstmals im kumulativen Update 4 veröffentlicht. Weitere Informationen zu diesem kumulativen Updatepaket für SQL Server 2008 R2 finden Sie im folgenden Artikel der Microsoft Knowledge Base:
2345451 Kumulatives Updatepaket 4 für SQL Server 2008 R2
Hinweis Da diese Builds kumulativ sind, enthält jede neue Version alle Hotfixes und alle Sicherheitsupdates, die in früheren SQL Server 2008 R2 enthalten waren. Wir empfehlen Sie prüfen die neueste Update-Version, die diesen Hotfix enthält. Weitere Informationen finden Sie im folgenden Artikel der Microsoft Knowledge Base:
981356 SQL Server 2008 R2 builds, die nach der Freigabe von SQL Server 2008 R2

Status


Microsoft hat bestätigt, dass es sich hierbei um ein Problem bei den in diesem Artikel genannten Microsoft-Produkten handelt.

Weitere Informationen


Gehen Sie folgendermaßen vor, um dieses Problem zu reproduzieren:
  1. Führen Sie den folgenden Code Prozeduren erstellen zwei ("p_test1" und "p_test2"). "P_test1" verwendet eine BLOB-Variable "p_test2" verwendet eine Variable vom Datentyp nvarchar(100)
    use tempdbgoif OBJECT_ID('p_test1') is not null drop proc p_test1if OBJECT_ID('p_test2') is not null drop proc p_test2gocreate proc p_test1@s nvarchar(max)asbeginselect * from sys.objects where name = UPPER(@s)endgocreate proc p_test2@s nvarchar(100)asbeginselect * from sys.objects where name = UPPER(@s)endgo 
  2. Führen Sie den folgenden Code den Prozedur-Cache deaktivieren und die beiden Ausführen gespeicherter Prozeduren:
    dbcc freeproccachegoexec p_test1 N'abc'exec p_test2 N'abc'go 
  3. Führen Sie den folgenden Code zum Überprüfen des zwischengespeicherten Plans:
    select object_name(CONVERT(int, a.value)), cp.*from sys.dm_exec_cached_plans cpcross apply sys.dm_exec_plan_attributes(cp.plan_handle) awhere cp.objtype = 'Proc'and a.attribute = 'objectid' 
Hinweis Sind viele gleichzeitige Ausführung dieser Art auf einer Microsoft SQL Server 2008 oder eine Instanz von Microsoft SQL Server 2008 R2, möglicherweise blockiert, die durch Kompilieren Sperren in der Instanz verursacht. Weitere Informationen über die Beschreibung des SQL Server-Blockierung verursacht durch Kompilieren Sperren finden Sie im folgenden Artikel der Microsoft Knowledge Base:
263889 Beschreibung des SQL Server-Blockierung verursacht durch Kompilieren Sperren

Informationsquellen


Weitere Informationen zu Funktionen (Transact-SQL) finden Sie auf folgender Microsoft-Website:Weitere Informationen zum inkrementellen Dienstmodell für SQL Server klicken Sie auf die folgenden Artikelnummer der Microsoft Knowledge Base:
935897 erläutert wird Steht ein inkrementelles Dienstmodell vom SQL Server-Team zu Hotfixes für gemeldete Probleme
Weitere Informationen zum Benennungsschema für SQL Server-Updates klicken Sie auf die folgenden Artikelnummer der Microsoft Knowledge Base:
822499Neues Benennungsschema für Softwareupdatepakete für Microsoft SQL Server
Um weitere Informationen zur Terminologie für Softwareupdates zu erhalten, klicken Sie auf die folgende Artikelnummer, um den Artikel der Microsoft Knowledge Base anzuzeigen:
824684 Beschreibung der Standardterminologie, die zum Beschreiben von Microsoft-Softwareupdates verwendet wird