KB2322209 - FIX: Resultados incorretos se utilizar parênteses em torno do SELECT numa declaração que tem uma expressão comum de mesa no SQL Server 2008

Sintomas

Num computador que está a executar o Microsoft SQL Server 2008, considere os seguintes cenários.

Cenário 1

Especifica uma expressão de tabela comum (CTE) utilizando a declaração WITH. Por exemplo, corre-se a seguinte consulta.

WITH common_table_expression AS (SELECT * FROM sys.objects)(SELECT * FROM common_table_expression)

Então, faça esta consulta.

SELECT *FROM sys.dm_exec_query_statsWHERE statement_start_offset > statement_end_offsetANDstatement_end_offset <> -1

Neste cenário, o plano de consulta em cache para esta consulta armazena valores statement_start_offset e statement_end_offset incorretos. Especificamente, nota que o valor statement_end_offset é menor do que o valor statement_start_offset quando se corre sys.dm_exec_query_stats visão dinâmica de gestão (DMV). Devido a este problema, um relatório de desempenho pode falhar quando o relatório assume que o valor statement_start_offset é sempre menor do que o valor statement_stop_offset.

Cenário 2

Especifica uma expressão de tabela comum utilizando a declaração COM e utiliza a opção RECOMPILE. Por exemplo, cria uma função no SQL Server 2008 utilizando o seguinte script.

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 executar uma consulta "select dbo.function1()", recebe a seguinte mensagem de erro:

Ocorreu um erro grave no comando atual. Os resultados, se houver, devem ser descartados.

Além disso, este erro pode ocorrer sem a opção RECOMPILE se o servidor SQL estiver a sentir tráfego pesado do servidor.

Cenário 3

Especifica uma expressão de tabela comum utilizando a declaração COM. Na declaração DOM, especifique uma tabela que não existe. Por exemplo, corre-se a seguinte consulta.

WITH computed_table (id) AS(SELECT id FROM this_table_does_not_exist) (SELECT id FROM dbo.computed_table) GO

Quando executar esta consulta, não recebe um erro para a mesa em falta.

Causa

Estes problemas ocorrem devido a um mau funcionamento de uma declaração SELECT que segue uma declaração COM. A declaração COM utiliza a seguinte sintaxe.

WITH common_table_expression AS(CTE_query_definition)

Esta declaração cria então um conjunto de resultados que é atribuído ao nome comum de expressão de tabela que foi especificado. Em seguida, siga esta declaração com uma declaração SELECT. Se esta segunda declaração estiver incluída em parênteses, e depois tentar efetuar uma operação sobre os resultados ou tentar executar uma visão de gestão dinâmica sys.dm_exec_query_stats, recebe resultados incorretos ou um erro.

Resolução

Informações do pacote de serviço Para resolver este problema, obtenha o mais recente pacote de serviços para o SQL Server 2008. Para mais informações, clique no número de artigo que se segue para ver o artigo na Base de Dados de Conhecimento Microsoft:

968382 Como obter o mais recente pacote de serviços para SQL Server 2008

Solução

Para resolver estes problemas, é preciso remover os parênteses da declaração que segue a expressão comum da mesa. Por exemplo, considere a seguinte declaração com a WITH que utiliza tais parênteses.

WITH common_table_expression AS (SELECT *FROM sys.objects)(SELECT * FROM common_table_expression)

Para contornar estes problemas, mude para a seguinte declaração com a WITH que não utiliza estes parênteses.

WITH common_table_expression AS (SELECT *FROM sys.objects)SELECT * FROM common_table_expressio

Estado

A Microsoft confirmou que se trata de um problema nos produtos da Microsoft que estão listados na secção "Aplica-se a". Este problema foi corrigido pela primeira vez no SQL Server 2008 Service Pack 2 (SP2).

Mais Informações

Para obter mais informações sobre como utilizar a declaração COM com uma expressão de mesa comum, visite a seguinte página da MSDN:

COM common_table_expression (Transact-SQL)Para mais informações sobre sys.dm_exec_query_stats, visite a seguinte página da MSDN:

sys.dm_exec_query_stats (Transact-SQL)

Precisa de mais ajuda?

Aumente os seus conhecimentos
Explore as formações
Seja o primeiro a obter novas funcionalidades
Aderir ao Microsoft insiders

As informações foram úteis?

Obrigado pelos seus comentários!

Obrigado pelo seu feedback! Parece que poderá ser benéfico reencaminhá-lo para um dos nossos agentes de suporte do Office.

×