PROBLEMA: Tabelas de TEMP locais do SQL Server não criadas quando a consulta parametrizada do ADO É usada

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: 295743
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Sintomas
Quando você executa uma consulta em uma tabela temporária criada por uma consulta parametrizada ActiveX Data Objects (ADO), o seguinte erro pode resultar:
Erro-2147217865 "inválido nome do objeto '# < nome da tabela >'

Esse problema ocorre com tanto o Microsoft OLEDB Provider para SQL Server (SQLOLEDB) e o Microsoft OLEDB Provider para ODBC driver (MSDASQL) com o driver do SQL Server.
Causa
ADO é projetado para fornecer alto desempenho com consultas parametrizadas. A arquitetura usa, no entanto, impede que a tabelas temporárias que são criadas dentro de uma consulta parametrizada de persistência fora da consulta.
Resolução
Várias soluções alternativas são apresentadas em "Mais informações" seção deste artigo.
Situação
Esse comportamento é por design.
Mais Informações
O código de Microsoft Visual Basic a seguir demonstra o problema:

Observação <username>Você deve alterar a ID de usuário <nomedousuário> valor e a senha = < senha de alta segurança > valor para os valores corretos antes de executar esse código. Certifique-se que a ID de usuário tenha as permissões apropriadas para executar esta operação no banco de dados.
Dim cn As New ADODB.ConnectionDim Cmd As New ADODB.CommandDim Rs As New ADODB.Recordsetcn.Open "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=<user name>; Password=<strong password>;Initial Catalog=pubs;Data Source=<INSERT YOUR SERVER NAME HERE!>"cn.Execute "SET NOCOUNT ON"Cmd.CommandType = adCmdTextCmd.Parameters.Append Cmd.CreateParameter("Par", adVarChar, adParamInput, 2, "CA")Cmd.CommandText = "SELECT au_id INTO #Pattern FROM authors where state = ? "Set Cmd.ActiveConnection = cnCmd.ExecuteCmd.CommandText = "select count(*) from #Pattern"Rs.Open Cmd, , adOpenStatic, adLockOptimistic      ' This line generates error.MsgBox Rs.Fields(0).ValueRs.Closecn.CloseSet cn = Nothing				
para contornar o problema, você pode fazer o seguinte:
  1. Usar uma consulta nonparameterized para criar a tabela temporária, como o seguinte:
    SELECT au_id INTO #Pattern FROM authors WHERE state = 'CA'					
  2. Use a tabela temporária no mesmo lote em que a tabela é criada; por exemplo:
    Dim cn As New ADODB.ConnectionDim Cmd As New ADODB.CommandDim Rs As New ADODB.Recordsetcn.Open "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=<user name>; Password=<strong password>; Initial Catalog=pubs;Data Source=reidwpri"cn.Execute "SET NOCOUNT ON"Cmd.CommandType = adCmdTextCmd.Parameters.Append Cmd.CreateParameter("Par", adVarChar, adParamInput, 2, "CA")Cmd.CommandText = "SELECT au_id INTO #Pattern FROM authors where state = ? " & _    "select count(*) from #Pattern"Set Cmd.ActiveConnection = cnRs.Open Cmd, , adOpenStatic, adLockOptimistic      ' This line generates error.MsgBox Rs.Fields(0).ValueRs.Closecn.CloseSet cn = Nothing					
  3. Usar tabelas temporárias globais em vez de tabelas temporárias locais:
    Dim cn As New ADODB.ConnectionDim Cmd As New ADODB.CommandDim Rs As New ADODB.Recordsetcn.Open "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=<user name>;Password=<strong password>;Initial Catalog=pubs;Data Source=reidwpri"cn.Execute "SET NOCOUNT ON"Cmd.CommandType = adCmdTextCmd.Parameters.Append Cmd.CreateParameter("Par", adVarChar, adParamInput, 2, "CA")Cmd.CommandText = "SELECT au_id INTO ##Pattern FROM authors where state = ? "Set Cmd.ActiveConnection = cnCmd.ExecuteCmd.CommandText = "SELECT count(*) from ##Pattern"Rs.Open Cmd, , adOpenStatic, adLockOptimistic      ' This line generates error.MsgBox Rs.Fields(0).ValueRs.Closecn.CloseSet cn = Nothing					

Propriedades

ID do Artigo: 295743 - Última Revisão: 12/06/2015 02:01:22 - Revisão: 3.3

Microsoft ActiveX Data Objects 2.0, Microsoft ActiveX Data Objects 2.1, Microsoft ActiveX Data Objects 2.5, Microsoft ActiveX Data Objects 2.6, Microsoft OLE DB Provider for SQL Server 7.0, Microsoft OLE DB Provider for SQL Server 7.01, Microsoft ODBC Driver para Microsoft SQL Server 3.7, Driver Microsoft ODBC para Microsoft SQL Server 3.6, Microsoft ODBC Driver para Microsoft SQL Server 3.7, Microsoft OLE DB Provider for ODBC 1.0, Microsoft OLE DB Provider for ODBC 1.1, Microsoft OLE DB Provider for ODBC 1.5, Microsoft OLE DB Provider for ODBC 2.0

  • kbnosurvey kbarchive kbmt kbprb KB295743 KbMtpt
Comentários