KB2380435 - CORREÇÃO: O plano de consulta para um procedimento armazenado não é armazenado em cache se o procedimento armazenado usa uma variável BLOB e a variável é usada em uma função de cadeia no Microsoft SQL Server 2008 ou no Microsoft SQL Server 2008 R2

Aplica-se a
SQL Server 2008 SQL Server 2008 R2

A Microsoft distribui as correções do Microsoft SQL Server 2008 e do Microsoft SQL Server 2008 R2 como um ficheiro transferível. Como as correções são cumulativas, cada nova versão contém todos os hotfixes e todas as correções de segurança que foram incluídas com o anterior SQL Server 2008 ou SQL Server 2008 R2 corrigir lançamento.

Sintomas

Considere o seguinte cenário:

  • Criar um procedimento armazenado no Microsoft SQL Server 2008 ou no Microsoft SQL Server 2008 R2.
  • O procedimento armazenado usa uma variável de objeto binário grande (BLOB).
  • A variável BLOB é usada em uma função de cadeia de caracteres.
  • Executa o procedimento armazenado.

Nesse cenário, o plano de consulta para o procedimento armazenado não é armazenado em cache.

Resolução

Informações sobre a atualização cumulativa

SQL Server 2008 Service Pack 1

A correção para esse problema foi lançada pela primeira vez na atualização cumulativa 10 para SQL Server 2008 Service Pack 1. Para obter mais informações sobre este pacote de atualização cumulativa, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:

2279604 Pacote de atualizações cumulativas 10 para SQL Server 2008 Service Pack 1Nota Como as compilações são cumulativas, cada nova versão de correção contém todos os hotfixes e todas as correções de segurança que foram incluídas com o anterior SQL Server 2008 corrigir lançamento. A Microsoft recomenda que você considere aplicar o lançamento de correção mais recente que contém esse hotfix. Para obter mais informações, clique no número abaixo para ler o artigo da Base de Dados de Conhecimento Microsoft:

970365 As compilações do SQL Server 2008 lançadas após o lançamento do SQL Server 2008 Service Pack 1 Os hotfixes do Microsoft SQL Server 2008 são criados para service packs SQL Server específicos. Tem de aplicar uma correção do SQL Server 2008 Service Pack 1 a uma instalação do SQL Server 2008 Service Pack 1. Por padrão, qualquer hotfix fornecido em um SQL Server service pack é incluído no próximo SQL Server service pack.

SQL Server 2008 Service Pack 2

A correção para este problema foi lançada pela primeira vez na Atualização Cumulativa 1 para o SQL Server 2008 Service Pack 2. Para obter mais informações sobre este pacote de atualização cumulativa, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:

2289254 Atualização cumulativa 1 para SQL Server 2008 Service Pack 2Nota Como as compilações são cumulativas, cada nova versão de correção contém todos os hotfixes e todas as correções de segurança que foram incluídas com o anterior SQL Server 2008 corrigir lançamento. Recomendamos que você considere aplicar o lançamento de correção mais recente que contém esse hotfix. Para obter mais informações, clique no número abaixo para ler o artigo da Base de Dados de Conhecimento Microsoft:

2402659 As compilações do SQL Server 2008 lançadas após o lançamento do SQL Server 2008 Service Pack 2

SQL Server 2008 R2

A correção para este problema foi lançada pela primeira vez na Atualização Cumulativa 4. Para obter mais informações sobre como obter este pacote de atualização cumulativa para o SQL Server 2008 R2, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:

2345451 pacote de atualizações cumulativas 4 para SQL Server 2008 R2 Observação Como as compilações são cumulativas, cada nova versão de correção contém todos os hotfixes e todas as correções de segurança que foram incluídas com o anterior SQL Server 2008 R2 corrigir lançamento. Recomendamos que você considere aplicar o lançamento de correção mais recente que contém esse hotfix. Para obter mais informações, clique no número abaixo para ler o artigo da Base de Dados de Conhecimento Microsoft:

981356 As compilações do SQL Server 2008 R2 lançadas após o SQL Server 2008 R2

Status

A Microsoft confirmou que este é um problema nos produtos da Microsoft listados na seção "Aplica-se a".

Mais informações

Para reproduzir este problema, siga estes passos:

  1. Execute o seguinte código para criar dois procedimentos armazenados ("p_test1" e "p_test2"). "P_test1" usa uma variável BLOB e "p_test2" usa uma variável nvarchar(100).use tempdb
    vá
    se OBJECT_ID('p_test1') não for null drop proc p_test1
    Se OBJECT_ID('p_test2') não for null drop proc p_test2
    vá
    criar p_test1 proc
    @s nvarchar(máx.)
    como
    começar
    Selecione * de sys.objects
    where name = MAIÚSCULAS(@s)
    fim
    vá
    criar p_test2 proc
    @s nvarchar(100)
    como
    começar
    Selecione * de sys.objects
    where name = MAIÚSCULAS(@s)
    fim
    vá

  2. Execute o código a seguir para limpar o cache de procedimento e executar os dois procedimentos armazenados:dbcc freeproccache
    vá
    exec p_test1 N'abc'
    exec p_test2 N'abc'
    vá

  3. Execute o seguinte código para marcar o plano armazenado em cache: selecione object_name(CONVERT(int, a.value)), cp.*
    a partir de sys.dm_exec_cached_plans cp
    aplicação cruzada sys.dm_exec_plan_attributes(cp.plan_handle) a
    onde cp.objtype = 'Proc'
    e a.attribute = 'objectid'

Observação Se houver muitas execuções simultâneas desse tipo de procedimento armazenado em uma instância do Microsoft SQL Server 2008 ou do Microsoft SQL Server 2008 R2, você poderá enfrentar bloqueios causados por bloqueios de compilação na instância.

Para obter mais informações sobre a descrição do bloqueio de SQL Server causado por bloqueios de compilação, consulte o seguinte artigo da Base de Dados de Conhecimento Microsoft:

263889 Descrição do bloqueio de SQL Server causado por bloqueios de compilação

Referências

Para obter mais informações sobre funções de cadeia de caracteres (Transact-SQL), visite o seguinte site da Microsoft:

Funções de cadeia de caracteres (Transact-SQL) Para obter mais informações sobre o modelo de manutenção incremental para SQL Server, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:

935897 Um modelo de serviços incrementais disponível da equipe do SQL Server para fornecer hotfixes para problemas relatados

Para obter mais informações sobre o esquema de nomenclatura para atualizações SQL Server, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:

822499 Novo esquema de nomenclatura para pacotes de atualização de software do Microsoft SQL Server Para obter mais informações sobre terminologia de atualização de software, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:

824684 Descrição da terminologia padrão usada para descrever as atualizações de software da Microsoft