Como resolver o SQL query parâmetros de mapeamento de problemas ao usar o Oracle fornecedor de OLE DB?
Pergunta
Ao tentar entrar em uma consulta SQL com parâmetros usando o Oracle fornecedor de OLE DB recebo o seguinte erro:
Os parâmetros não podem ser extraídos a partir de comandos de SQL.O provedor pode não ajudar a analisar informações de parâmetro do comando.Nesse caso, utilize o comando SQL a partir de variáveis" modo de acesso, em que todo comando SQL é armazenado em uma variável.
INFORMAÇÕES ADICIONAIS:
O provedor não pode derivar informações de parâmetro e SetParameterInfo não foi chamado.(Microsoft OLE DB Provider para Oracle)
Eu tentei seguir a sugestão aqui, mas não entendo muito bem o que é necessário:Consultas parametrizadas contra a Oracle
Qualquer idéias?
Solução
Para expandir o link na pergunta:
- Criar uma variável de pacote
- Faça duplo clique no pacote de nome de variável.(Isso permite a você acessar as propriedades da variável)
- Defina a propriedade 'EvaluateAsExpression' para true
- Introduza a consulta no construtor de expressões.
- Definir a origem de OLE DB consulta para SQL Comando Variável
O construtor de expressões pode criar dinamicamente usando expressões variável para criar 'parametised consultas'.
Portanto, o seguinte 'normal' de consulta:
select * from book where book.BOOK_ID = ?
Pode ser escrito em o construtor de expressões como:
"select * from book where book.BOOK_ID = " + @[User::BookID]
Em seguida, você pode fazer null manipulação e conversão de dados usando o construtor de expressões.
Outras dicas
Se Você usar a Tarefa de Fluxo de Dados e usar o provedor OLE DB Source, e você precisa de parametrizar a sua Consulta :
- Criar uma Variável para guardar "Cheio" de instrução de Consulta :Clique com o direito na área em branco fora do pacote e Clique em Variáveis :
Clique em Adicionar Variáveis na Janela de Variáveis :
Fazer o nome é SQL_DTFLOW_FULL
ou algo que se pode entender facilmente.O variable data type
é STRING
- Crie Variável(s) para salvar a sua parâmetro(s).
eu.e, do total de Consulta stamements é :
SELECT * FROM BOOK WHERE BOOK_ID = @BookID --@BookID is SQL Parameter
no exemplo acima, eu tenho apenas um parâmetro :@BookID, então eu preciso criar uma variável para guardar o meu parâmetro.Adicionar mais variáveis depende de suas Consultas.
Dê a ele o nome de SQL_DTFLOW_BOOKID
O variable data type
é STRING
Então, você precisa de fazer o seu SSIS puro, e as variáveis é classificada em compreensível partes.
Tente fazer com que o nome da variável é SQL_{TASK NAME}_{VariableName}
- Faça Expressão para
SQL_DTFLOW_FULL
variável, clique no número 1, e começar a preencher com o número 2.Faça Suas Instruções SQL para ser uma correcta Instrução SQL usando a corda do bloco.Seqüência de bloco geralmente usando "aspas Duplas" no início e no final.Concat variáveis com a seqüência de bloco.
Clique em avaliar a Expressão, a mostrar resultado, certifique-se de que sua consulta é correto, copie-o e cole o resultado da Consulta no SSMS.
Certifique-se por si mesmo que as variáveis é livre de Injeção de SQL usando a sua própria lógica.(Use o desenvolvedor instinto)
- Abra a Tarefa de Fluxo de Dados, abra a Origem de OLE DB Editor através de um duplo clique no item.
- Selecione o Modo de Acesso a Dados :
SQL Command From Variable
- Selecione o Nome da Variável :
SQL_DTFLOW_FULL
- Clique em Visualizar para se certificar de que ele funciona.
Que é tudo, a minha maneira de evitar esse SSIS caso de falha.Desde que eu uso dessa forma, eu nunca tive esse problema, você sabe, o SSIS algo está estranho.
Para alterar o valor da variável, defini-lo antes de Tarefa de Fluxo de Dados, o SQL Resultado de SQL_DTFLOW_FULL
variável será alterada a cada alterar o valor da variável.
No meu caso o problema era que eu tinha comentários dentro do sql na forma normal de /* */ e eu também tive apelidos de coluna como "nome da Coluna" em vez de [Nome da Coluna].
Uma vez eu removido funciona.
Tente também tem o seu parâmetro ?instrução dentro da cláusula WHERE e não dentro da UNE, que foi parte do problema também.