Usando openrowset para ler um arquivo do Excel em uma tabela temporária; como eu referência nessa mesa?
-
21-08-2019 - |
Pergunta
Eu estou tentando escrever um procedimento armazenado que irá ler um arquivo do Excel em uma tabela temporária, em seguida, massageie alguns dos dados na tabela, em seguida, insira as linhas selecionadas de que a tabela em uma tabela permanente.
Assim, ele começa assim:
SET @SQL = "select * into #mytemptable FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database="+@file+";HDR=YES', 'SELECT * FROM [Sheet1$]')"
EXEC (@SQL)
Que muito parece funcionar.
No entanto, se eu tente algo como isto:
Select * from #mytemptable
Eu recebo um erro:
nome do objeto inválido '#mytemptable'
Por que não #mytemptable reconhecido? Existe uma maneira de ter #mytemptable acessível ao resto do procedimento armazenado?
Muito obrigado antecipadamente!
Solução
Eu não tenho tempo para zombar isso, então eu não sei se ele vai trabalhar, mas tentar chamar sua mesa '## mytemptable' em vez de '#mytemptable'
Eu estou supondo que o problema é que a sua tabela não está no escopo mais depois de exec () da string sql. tabelas temporárias precedidos por dois símbolos da libra são globalmente acessível.
Não se esqueça de deixar cair quando você está feito com ele!
Outras dicas
A maneira que eu tenho feito isso no passado era: Primeiro, crie o #temp_table usando CREATE TABLE. Em segundo lugar, construir a consulta dinâmica como a inserção de costume na #temp_table Terceiro, o uso exec sp_executesql @sql.
Com este método você não vai precisar do escopo global ## temp_table.
Você pode usá-lo no mesmo escopo, incluindo todo o roteiro na consulta dinâmica:
DECLARE @strSQL nvarchar(max)
DECLARE @file varchar(100)
SET @file='c:\myfile.xls'
SET @strSQL=N'SELECT * INTO #mytemptable FROM OPENROWSET(''Microsoft.Jet.OLEDB.4.0'', ''Excel 8.0;Database='+@file+';HDR=YES'', ''SELECT * FROM [Sheet1$]'');'
SET @strSQL=@strSQL+N'SELECT * FROM #mytemptable'
EXECUTE sp_executesql @strSQL