Использование openrowset для чтения файла Excel во временную таблицу;как мне ссылаться на эту таблицу?
-
21-08-2019 - |
Вопрос
Я пытаюсь написать хранимую процедуру, которая будет считывать файл Excel во временную таблицу, затем обрабатывать некоторые данные в этой таблице, а затем вставлять выбранные строки из этой таблицы в постоянную таблицу.
Итак, все начинается так:
SET @SQL = "select * into #mytemptable FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database="+@file+";HDR=YES', 'SELECT * FROM [Sheet1$]')"
EXEC (@SQL)
Кажется, это работает.
Однако, если я попробую что-то вроде этого:
Select * from #mytemptable
Я получаю сообщение об ошибке:
Неверное имя объекта «#mytemptable».
Почему #mytemptable не распознается?Есть ли способ сделать #mytemptable доступным для остальной части хранимой процедуры?
Спасибо заранее!
Решение
У меня нет времени это издеваться, поэтому я не знаю, сработает ли это, но попробуйте назвать вашу таблицу «##mytemptable» вместо «#mytemptable».
Я предполагаю, что ваша проблема в том, что ваша таблица больше не находится в области видимости после того, как вы выполнили() строку sql.Таблицы Temp, которым предшествуют два символа фунта, доступны глобально.
Не забудьте бросить его, когда закончите!
Другие советы
Раньше я делал это следующим образом:Сначала создайте #temp_table с помощью CREATE TABLE.Во -вторых, постройте динамический запрос, как обычно, вставляя в треть #temp_table, используйте exec sp_executesql @sql.
При использовании этого метода вам не понадобится глобальная ##temp_table.
Вы можете использовать его в той же области, включая весь скрипт в динамическом запросе:
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