FIX: resultados incorretos se você usar parênteses ao redor de SELECT em uma instrução que contém uma expressão de tabela comuns no SQL Server 2008

Traduções deste artigo Traduções deste artigo
ID do artigo: 2322209 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Neste artigo

Sintomas

Em um computador que esteja executando o Microsoft SQL Server 2008, considere os cenários a seguir.

Cenário 1

Especificar uma expressão de tabela comuns (CTE) por meio da instrução WITH. Por exemplo, você deve executar a consulta seguinte.
WITH common_table_expression AS 

(SELECT * FROM sys.objects)

(SELECT *

FROM common_table_expression)
Em seguida, você deve executar essa consulta.
SELECT *

FROM sys.dm_exec_query_stats

WHERE statement_start_offset > statement_end_offset

AND

statement_end_offset <> -1
Neste cenário, o plano de consulta em cache para esta consulta armazena valores incorretos de statement_start_offset e statement_end_offset. Especificamente, observe o valor statement_end_offset é menor do que o valor de statement_start_offset quando você executa o modo de exibição de gerenciamento dinâmico sys.dm_exec_query_stats (DMV).

Por causa do 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

Especificar uma expressão de tabela comum por meio da instrução WITH, e você usar a opção RECOMPILE. Por exemplo, criar uma função no SQL Server 2008 usando o seguinte script.
CREATE FUNCTION function1() RETURNS int AS
BEGIN
DECLARE @x int
SET @x=1;
WITH common_table_expression AS

(SELECT @x AS column1)

(SELECT @x=column1 FROM common_table_expression)

OPTION(RECOMPILE)
RETURN @x
END
Quando você executa uma consulta ? selecione dbo.function1() ?, você recebe a seguinte mensagem de erro:
um grave erro sobre o comando atual. Os resultados, se houver algum, deverão ser descartados.

Além disso, este erro pode ocorrer sem a opção RECOMPILE se o SQL server está passando por tráfego pesado de servidor.

Cenário 3

Especificar uma expressão de tabela comum por meio da instrução WITH. Instrução WITH, você pode especificar uma tabela que não existe. Por exemplo, você deve executar a consulta seguinte.
WITH computed_table (id) AS
(SELECT id 
FROM this_table_does_not_exist) 
(SELECT id 
FROM dbo.computed_table) 
GO
Quando você executar essa consulta, você não receber um erro para a tabela está faltando.

Causa

Esses problemas ocorrem devido a um processamento com problemas de uma instrução SELECT que segue uma instrução WITH. A instrução WITH usa a sintaxe a seguir.
WITH common_table_expression AS

(CTE_query_definition)
Nesta declaração, em seguida, cria um conjunto de resultados que é atribuído para o nome de expressão de tabela comum, que foi especificado. Em seguida, você seguir essa declaração com uma instrução SELECT. Se esta segunda instrução seja colocada entre parênteses e você tenta executar uma operação nos resultados ou tenta executar um modo de exibição de gerenciamento dinâmico de sys.dm_exec_query_stats, você recebe resultados incorretos ou um erro.

Resolução

Esses problemas foram resolvidos na CTP do SQL Server 2008 Service Pack 2. Baixe e instale as últimas SQL Server 2008 service pack.
968382Como obter o service pack mais recente do SQL Server 2008
O SQL Server 2008 Service Pack 2 CTP, podem ser baixado diretamente a partir do Centro de download da Microsoft:
CTP do SQL Server 2008 Service Pack 2

Como Contornar

Para solucionar esses problemas, remova-os entre parênteses da instrução que segue a expressão de tabela comum. Por exemplo, considere o seguinte com a declaração que usa esses entre parênteses.
WITH common_table_expression AS 

(SELECT *
FROM sys.objects)

(SELECT *

FROM common_table_expression)
Para solucionar esses problemas, altere para a seguir com a instrução que não usa esses entre parênteses.
WITH common_table_expression AS 

(SELECT *
FROM sys.objects)
SELECT *

FROM common_table_expressio

Situação

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

Mais Informações

Para obter mais informações sobre como usar a instrução WITH com uma expressão de tabela comuns, visite a seguinte página da Web do MSDN:
WITH common_table_expression (Transact-SQL)
Para obter mais informações sobre sys.dm_exec_query_stats, visite a seguinte página da Web do MSDN:
sys.dm_exec_query_stats (Transact-SQL)

Propriedades

ID do artigo: 2322209 - Última revisão: terça-feira, 31 de agosto de 2010 - Revisão: 1.0
A informação contida neste artigo aplica-se a:
  • Microsoft SQL Server 2008 Developer
  • Microsoft SQL Server 2008 Enterprise
  • Microsoft SQL Server 2008 Standard
  • Microsoft SQL Server 2008 Workgroup
Palavras-chave: 
kbqfe kbfix kbexpertiseadvanced kbsurveynew kbtshoot kbquery kbmt KB2322209 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 2322209

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com