CORRECÇÃO: A função fn_get_sql retorna texto SQL para o identificador na tabela de sistema Sysprocesses

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

Neste artigo

Sumário

Este artigo descreve um hotfix funcional para SQL Server 2000 implementa as seguintes alterações:
  • O hotfix cria uma nova fn_get_sql sistema função table valued.
  • O hotfix adiciona esses três novas colunas ao final do mestre sysprocesses tabela de sistema:
    • sql_handle (binário)
    • stmt_start (int)
    • stmt_end (int)

  • O hotfix cria um novo sinalizador de rastreamento, o sinalizador de rastreamento 2861.

Resolução

Para resolver esse problema, obtenha o service pack mais recente para o Microsoft SQL Server 2000. Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
290211Como obter o SQL Server 2000 service pack mais recente
Observação O seguinte hotfix foi criado antes do lançamento do Microsoft SQL Server 2000 Service Pack 3.

Arquivo de hotfix

Há um hotfix para SQL Server 2000 que implementa a função fn_get_sql .

Contate o Atendimento Microsoft para obter a correção. A versão em inglês deste hotfix tem atributos de arquivo (ou atributos de arquivo posteriores) listados na tabela a seguir. As datas e horas desses arquivos estão listadas no horário de universal coordenado (UTC). Quando você exibe as informações do arquivo, ele é convertido para a hora local. Para encontrar a diferença entre o UTC e a hora local, use a guia fuso horário na ferramenta Data e hora no painel de controle.
   Date         Time      Version    Size              File name
   -----------------------------------------------------------------

   07/01/2002   4:50 PM   8.00.652   7,285 kilobytes   Sqlservr.exe
				
Observação Devido às dependências do arquivo, o hotfix mais recente ou o recurso que contém os arquivos também pode conter arquivos adicionais.

importante Se você deseja a funcionalidade dessa correção, você deve aplicar uma compilação Sqlservr.exe posterior ou igual a 8.00.652 e, você deve executar o Sp2_qfe_serv_uni.sql arquivo que está incluído nessa correção. Para obter mais informações, consulte o Leiame.txt arquivo que está incluído nos arquivos de correção.

Situação

A Microsoft confirmou que este é um problema nos produtos da Microsoft listados no começo deste artigo.Esse problema foi corrigido primeiro no Microsoft SQL Server 2000 Service Pack 3.

Mais Informações

Aqui está uma definição e a sintaxe para a função com valor de tabela de sistema fn_get_sql .

fn_get_sql

Retorna o texto SQL chamado para o identificador especificado.

Sintaxe

fn_get_sql ([ @ SqlHandle =] SqlHandle )

Argumentos

[ @ SqlHandle =] SqlHandle

O valor do identificador binário. SqlHandle é binary(20) com não padrão.

Tabelas retornadas

Recolher esta tabelaExpandir esta tabela
nome da coluna tipo de dados Descrição
DBID smallint Identificação do banco de dados. NULL em caso de instruções SQL de ad-hoc.
objectid int Identificação do objeto de banco de dados. NULL em caso de SQL ad-hoc instruções.
número smallint Número no procedimento agrupamento se agrupados. 0 entradas que não são procedimentos. NULL em caso de instruções SQL de ad-hoc.
criptografado bit Indica se o objeto é criptografado:
0 = Não criptografados
1 = Criptografada
texto texto Texto SQL. NULL em caso de objetos criptografados.

Comentários

Fn_get_sql é uma função com valor de tabela de sistema que retorna o texto SQL para SQLHANDLE especificado. Você pode obter um SQLHANDLE válido da coluna sql_handle da tabela de sistema sysprocesses .

Se você passar um identificador que não existe mais no cache, fn_get_sql retornará um conjunto de resultado vazio. Se você passar um identificador inválido, o lote será finalizado e você receber a seguinte mensagem de erro:
Servidor: Mensagem 569, nível 16, estado 1, procedimento fn_get_sql, linha 12 O identificador passado para fn_get_sql era inválida.
SQL Server não é possível armazenar em cache algumas instruções de Transact-SQL, como instruções de operação em massa e instruções com literais de seqüência de caracteres maiores do que 8 KB. Os identificadores para essas instruções não são recuperáveis por meio da função fn_get_sql .

A coluna de texto está filtrada para texto que pode conter senhas. Revise o tópico "Limitar rastreamentos" nos manuais online do SQL Server para obter detalhes sobre os procedimentos armazenados relacionados à segurança que não são monitorados.

Permissões

Somente os membros da função de servidor fixa sysadmin podem executar a função fn_get_sql .

Exemplos

As informações retornadas pela função fn_get_sql são semelhante ao comando DBCC INPUTBUFFER. Use a função fn_get_sql em situações onde DBCC INPUTBUFFER é limitada, como:
  • Quando eventos têm mais de 255 caracteres.
  • Quando você precisa retornar o maior nível de aninhamento atual de um procedimento armazenado. Por exemplo, você tiver dois procedimentos armazenados que são nomeados sp_1 e sp_2 . Se o sp_1 armazenado chamadas de procedimento sp_2 procedimento armazenado e obter o identificador da tabela de sistema sysprocesses enquanto sp_2 está sendo executado, a função fn_get_sql retornará informações sobre sp_2 . Além disso, a função fn_get_sql retorna o procedimento armazenado todo no nível de aninhamento mais alto atual.
Os administradores de banco de dados podem usar a função fn_get_sql para ajudar a diagnosticar problema processos. Depois que um administrador identifica um processo de servidor do problema ID (SPID), o administrador pode recuperar o SQLHANDLE para que SPID e em seguida, chamar a função fn_get_sql com o identificador e use os deslocamentos de início e término para determinar o texto SQL do problema SPID. Por exemplo:
DECLARE @Handle binary(20)
SELECT @Handle = sql_handle FROM sysprocesses WHERE spid = 52
SELECT * FROM ::fn_get_sql(@Handle) 
				
você também pode usar a função fn_get_sql para monitorar continuamente o servidor. Por exemplo, uma ferramenta de cliente recupera periodicamente o SQLHANDLE instrução inicial e final deslocamentos da tabela de sistema sysprocesses . A ferramenta mantém um cache de texto SQL, com o identificador SQL como a chave exclusiva e os resultados da função fn_get_sql como o valor. Para cada linha no conjunto de sysprocesses sistema tabela linhas, a ferramenta procura o texto em seu cache baseado no SQLHANDLE. Se o texto não estiver no cache da ferramenta, a ferramenta, em seguida, chama a função fn_get_sql para obter o texto e salvá-lo em seu cache.

Sinalizador 2861 de rastreamento

Sinalizador de rastreamento 2861 instrui o SQL Server para manter zero planos de custo em cache, que o SQL Server seria normalmente não cache (como consultas ad-hoc simples, conjunto de instruções, transação de confirmação e outros).
  • Se o sinalizador de rastreamento 2861 estiver ativado, a função fn_get_sql pode retornar o texto SQL para atividades que tiver zero planos de custo. Se o sinalizador de rastreamento 2861 é desativado, a função fn_get_sql não pode retornar o texto SQL para as atividades com zero planos de custo.
  • Por padrão, o sinalizador de rastreamento 2861 é desativada quando você aplicar essa correção.

Comentários

O número de objetos no cache de procedimento aumentar quando o sinalizador de rastreamento 2861 está ativado. Como os objetos adicionais são tão pequenos, você verá um pequeno aumento na memória, que é ocupado pelo cache de procedimento.

SQL Server 2000 tem um algoritmo eficiente para localizar qualquer plano de execução existentes de qualquer instrução SQL especificada. No entanto, devido ao maior número de objetos armazenados no cache de procedimento, é possível que o tempo necessário para o mecanismo relacional procurar por um plano existente pode degradar e pode afetar negativamente o desempenho do sistema.

Normalmente, em sistemas onde o tamanho do banco de dados é muito maior que o tamanho da memória, o sistema está sob alguns pressão de memória esperada. Se a pressão de memória que memória é necessária para outros objetos, o processo lazywriter será desalocar objetos no cache de procedimento. Isso irá vincular o tamanho do cache procedimento e minimizará o efeito adverso potencial dessa alteração.

No entanto, em sistemas onde o tamanho de memória é maior que o tamanho do banco de dados, o sistema é geralmente não sob pressão de memória. Portanto, objetos não são desalocados do cache de procedimento devido a necessidades de memória e pode aumentar o tamanho do cache de procedimento para um ponto de onde ele irá afetar negativamente desempenho.

Se você observar um efeito adverso no desempenho do sistema, execute estas etapas:
  1. Desative o sinalizador de rastreamento 2861.
  2. Execute o comando DBCC FREEPROCCACHE do Query Analyzer. Não é necessário reiniciar o SQL Server.

Propriedades

ID do artigo: 325607 - Última revisão: terça-feira, 27 de setembro de 2005 - Revisão: 5.3
A informação contida neste artigo aplica-se a:
  • Microsoft SQL Server 2000 Standard Edition
Palavras-chave: 
kbmt kbhotfixserver kbqfe kbsqlserv2000sp3fix kbfix kbinfo kbsqlserv2000presp3fix KB325607 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: 325607

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