Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
A API ODBC define a execução preparada como uma maneira de reduzir a análise e a sobrecarga de compilação associada à execução repetida de uma instrução Transact-SQL. O aplicativo cria uma cadeia de caracteres que contém uma instrução SQL e a executa em dois estágios. Ele chama a Função SQLPrepare uma vez para que a instrução seja analisada e compilada em um plano de execução pelo Mecanismo de Banco de Dados. Em seguida, ele chama SQLExecute para cada execução do plano de execução preparado. Isso salva a análise e a sobrecarga de compilação em cada execução. A execução preparada geralmente é usada por aplicativos para executar repetidamente a mesma instrução SQL parametrizada.
Para a maioria dos bancos de dados, a execução preparada é mais rápida do que a execução direta para instruções executadas mais de três ou quatro vezes, principalmente porque a instrução é compilada apenas uma vez, enquanto as instruções executadas diretamente são compiladas sempre que são executadas. A execução preparada também pode fornecer uma redução no tráfego de rede porque o driver pode enviar um identificador de plano de execução e os valores de parâmetro, em vez de uma instrução SQL inteira, para a fonte de dados sempre que a instrução é executada.
O SQL Server reduz a diferença de desempenho entre a execução direta e preparada por meio de algoritmos aprimorados para detectar e reutilização de planos de execução do SQLExecDirect. Isso disponibiliza alguns dos benefícios de desempenho da execução preparada para instruções executadas diretamente. Para obter mais informações, consulte Execução Direta.
O SQL Server também fornece suporte nativo para execução preparada. Um plano de execução é criado no SQLPrepare e posteriormente executado quando SQLExecute é chamado. Como o SQL Server não é necessário para criar procedimentos armazenados temporários no SQLPrepare, não há sobrecarga adicional nas tabelas do sistema no tempdb.
Por motivos de desempenho, a preparação da instrução é adiada até que SQLExecute seja chamado ou uma operação de metaproperty (como SQLDescribeCol ou SQLDescribeParam no ODBC) seja executada. Esse é o comportamento padrão. Os erros na instrução que está sendo preparada não são conhecidos até que a instrução seja executada ou uma operação de metapropertia seja executada. Definir o atributo de instrução específica do driver ODBC do SQL Server Native Client SQL_SOPT_SS_DEFER_PREPARE para SQL_DP_OFF pode desativar esse comportamento padrão.
No caso de preparação adiada, chamar SQLDescribeCol ou SQLDescribeParam antes de chamar SQLExecute gera uma viagem de ida e volta extra para o servidor. No SQLDescribeCol, o driver remove a cláusula WHERE da consulta e a envia para o servidor com SET FMTONLY ON para obter a descrição das colunas no primeiro conjunto de resultados retornado pela consulta. No SQLDescribeParam, o driver chama o servidor para obter uma descrição das expressões ou colunas referenciadas por quaisquer marcadores de parâmetro na consulta. Esse método também tem algumas restrições, como não conseguir resolver parâmetros em subconsultas.
O uso excessivo do SQLPrepare com o driver ODBC do SQL Server Native Client degrada o desempenho, especialmente quando conectado a versões anteriores do SQL Server. A execução preparada não deve ser usada para instruções executadas uma única vez. A execução preparada é mais lenta do que a execução direta para uma única execução de uma instrução, pois requer uma viagem de ida e volta de rede extra do cliente para o servidor. Em versões anteriores do SQL Server, ele também gera um procedimento armazenado temporário.
Instruções preparadas não podem ser usadas para criar objetos temporários no SQL Server.
Alguns aplicativos ODBC iniciais usavam SQLPrepare sempreque SQLBindParameter era usado. SQLBindParameter não requer o uso do SQLPrepare, ele pode ser usado com SQLExecDirect. Por exemplo, use SQLExecDirect com SQLBindParameter para recuperar o código de retorno ou os parâmetros de saída de um procedimento armazenado executado apenas uma vez. Não use SQLPrepare com SQLBindParameter , a menos que a mesma instrução seja executada várias vezes.