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.

Симптоми

Имайте предвид сценария, описан по-долу:

  • Съхранена процедура се създава в Microsoft SQL Server 2008 или в Microsoft SQL Server 2008 R2.
  • Съхранена процедура използва променлива на двоичен голям обект (BLOB).
  • Променливата BLOB се използва във низова функция.
  • Изпълнявате съхранената процедура.

При този сценарий планът на заявката за съхранената процедура не е кеширан.

Решение

Кумулативна информация за актуализацията

SQL Server 2008 Service Pack 1

Корекцията за този проблем е издадена за първи път в сборна актуализация 10 за SQL Server 2008 Service Pack 1. За допълнителна информация относно този пакет за кумулативна актуализация щракнете върху следния номер на статия, за да прегледате статията в базата знания на Microsoft:

2279604 Сборен пакет за актуализация 10 за SQL Server 2008 Service Pack 1Note Тъй като компилациите са кумулативни, всяко ново издание на корекции съдържа всички актуални поправки и корекции на защитата, които са включени в предишното издание на корекция SQL Server 2008. Microsoft препоръчва да обмислите прилагането на най-новото издание на корекцията, което съдържа тази гореща корекция. За допълнителна информация щракнете върху следния номер на статия, за да прегледате статията в базата знания на Microsoft:

970365 Компилациите на SQL Server 2008, които са издадени след издаването на SQL Server 2008 Service Pack 1 Актуалните корекции на Microsoft SQL Server 2008 се създават за определени сервизни пакети за SQL Server. Трябва да приложите актуална корекция за SQL Server 2008 Service Pack 1 към инсталация на SQL Server 2008 Service Pack 1. По подразбиране всяка актуална корекция, предоставена в сервизен пакет на SQL Server, се включва в следващия сервизен пакет на SQL Server.

SQL Server 2008 Service Pack 2

Корекцията за този проблем е издадена за първи път в сборна актуализация 1 за SQL Server 2008 Service Pack 2. За допълнителна информация относно този пакет за кумулативна актуализация щракнете върху следния номер на статия, за да прегледате статията в базата знания на Microsoft:

2289254 Сборна актуализация 1 за SQL Server 2008 Service Pack 2Note Тъй като компилациите са кумулативни, всяка нова корекция съдържа всички актуални поправки и корекции на защитата, които са включени в предишното издание на корекция SQL Server 2008. Препоръчваме ви да помислите за прилагане на най-новото издание на корекцията, което съдържа тази гореща корекция. За допълнителна информация щракнете върху следния номер на статия, за да прегледате статията в базата знания на Microsoft:

2402659 Компилациите на SQL Server 2008, които са издадени след издаването на SQL Server 2008 Service Pack 2

SQL Server 2008 R2

Корекцията за този проблем е издадена за първи път в кумулативна актуализация 4. За допълнителна информация как да получите този сборен пакет за актуализация за SQL Server 2008 R2, щракнете върху следния номер на статия, за да прегледате статията в базата знания на Microsoft:

2345451 Сборен пакет за актуализация 4 за SQL Server 2008 R2 Забележка: Тъй като компилациите са кумулативни, всяко ново издание на корекции съдържа всички актуални поправки и корекции на защитата, които са включени в предишното издание на корекция за SQL Server 2008 R2. Препоръчваме ви да помислите за прилагане на най-новото издание на корекцията, което съдържа тази гореща корекция. За допълнителна информация щракнете върху следния номер на статия, за да прегледате статията в базата знания на 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, Drop Proc p_test1
    Ако OBJECT_ID('p_test2') не е null, пуснете p_test2
    отидете
    create proc p_test1
    @s NVARCHAR(макс)
    като
    започване
    SELECT * FROM sys.Objects
    where name = UPPER(@s)
    край
    отидете
    create proc p_test2
    @s Нварчар(100)
    като
    започване
    SELECT * FROM sys.Objects
    where name = UPPER(@s)
    край
    отидете

  2. Изпълнете следния код, за да изчистите кеша на процедурата и да изпълните двете съхранени процедури:dbcc freeproccache
    отидете
    exec p_test1 N'abc'
    exec p_test2 N'abc'
    отидете

  3. Изпълнете следния код, за да проверите кеширания план: Select object_name(CONVERT(int; a.value)), cp.*
    От sys.dm_exec_cached_plans cp
    кръстосано прилагане на sys.dm_exec_plan_attributes(cp.plan_handle) a
    where cp.objtype = 'Proc'
    and 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 се предлага модел на постъпково обслужване, който да предоставя актуални корекции за съобщени проблеми

За допълнителна информация относно схемата за именуване на актуализациите на SQL Server щракнете върху следния номер на статия, за да прегледате статията в базата знания на Microsoft:

822499 Нова схема за именуване на пакетите за актуализация на софтуера на Microsoft SQL Server За повече информация относно терминологията за софтуерни актуализации щракнете върху следния номер на статия в базата знания на Microsoft:

824684 Описание на стандартната терминология, която се използва за описание на софтуерните актуализации на Microsoft