Sintomas
Em um computador que esteja executando o Microsoft SQL Server 2008, considere os cenários a seguir.
Cenário 1
Você especifica uma CTE (expressão de tabela comum) usando a instrução WITH. Por exemplo, você executa a seguinte consulta.
WITH common_table_expression AS (SELECT * FROM sys.objects)(SELECT * FROM common_table_expression)
Em seguida, você executa essa consulta.
SELECT *FROM sys.dm_exec_query_statsWHERE statement_start_offset > statement_end_offsetANDstatement_end_offset <> -1
Nesse cenário, o plano de consulta em cache para esta consulta armazena valores de statement_start_offset e statement_end_offset incorretos. Especificamente, você percebe que o valor de statement_end_offset é menor do que o valor de statement_start_offset quando você executa sys.dm_exec_query_stats a DMV (exibição de gerenciamento dinâmico). Devido a esse problema, um relatório de desempenho pode falhar quando o relatório pressupõe que o valor de statement_start_offset é sempre menor do que o valor de statement_stop_offset.
Cenário 2
Você especifica uma expressão de tabela comum usando a instrução WITH e usa a opção de recompilação. Por exemplo, você cria uma função no SQL Server 2008 usando o script a seguir.
CREATE FUNCTION function1() RETURNS int ASBEGINDECLARE @x intSET @x=1;WITH common_table_expression AS (SELECT @x AS column1) (SELECT @x=column1 FROM common_table_expression) OPTION(RECOMPILE)RETURN @xEND
Quando você executa uma consulta "selecionar dbo. function1 ()", você recebe a seguinte mensagem de erro:
Ocorreu um erro grave no comando atual. Os resultados, se houver, devem ser descartados.
Além disso, esse erro pode ocorrer sem a opção de recompilação se o SQL Server estiver apresentando tráfego de servidor pesado.
Cenário 3
Você especifica uma expressão de tabela comum usando a instrução WITH. Na instrução WITH, você especifica uma tabela que não existe. Por exemplo, você executa a seguinte consulta.
WITH computed_table (id) AS(SELECT id FROM this_table_does_not_exist) (SELECT id FROM dbo.computed_table) GO
Quando você executa essa consulta, você não recebe um erro para a tabela ausente.
Causa
Esses problemas ocorrem devido a um devido mau processamento de uma instrução SELECT que acompanha a instrução a com. A instrução WITH usa a sintaxe a seguir.
WITH common_table_expression AS(CTE_query_definition)
Em seguida, essa instrução cria um conjunto de resultados que é atribuído ao nome de expressão de tabela comum especificado. Em seguida, você segue essa instrução com uma instrução SELECT. Se essa segunda instrução estiver colocada entre parênteses e você tentar executar uma operação nos resultados ou se tentar executar um modo de exibição de gerenciamento dinâmico sys.dm_exec_query_stats, você receberá resultados incorretos ou um erro.
Resolução
Informações do Service Pack Para solucionar esse problema, obtenha o Service Pack mais recente do SQL Server 2008. Para obter mais informações, clique no número abaixo para ler os artigos na Base de Dados de Conhecimento Microsoft:
968382 Como obter o Service Pack mais recente para o SQL Server 2008
Solução alternativa
Para contornar esses problemas, você precisa remover os parênteses da instrução que acompanha a expressão de tabela comum. Por exemplo, considere o seguinte instrução WITH que usa tais parênteses.
WITH common_table_expression AS (SELECT *FROM sys.objects)(SELECT * FROM common_table_expression)
Para contornar esses problemas, altere para o seguinte, com uma instrução que não usa esses parênteses.
WITH common_table_expression AS (SELECT *FROM sys.objects)SELECT * FROM common_table_expressio
Status
A Microsoft confirmou que isso é um problema dos produtos da Microsoft listados na seção "aplica-se a". Esse problema foi corrigido primeiro no SQL Server 2008 Service Pack 2 (SP2).
Informações adicionais
Para obter mais informações sobre como usar a instrução WITH com uma expressão de tabela comum, acesse a seguinte página da Web do MSDN:
COM o common_table_expression (Transact-SQL)Para obter mais informações sobre sys.dm_exec_query_stats, acesse a seguinte página da Web do MSDN: