Использование openrowset для чтения файла Excel во временную таблицу; как мне ссылаться на эту таблицу? - PullRequest
2 голосов
/ 14 мая 2009

Я пытаюсь написать хранимую процедуру, которая будет считывать файл 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 доступным для остальной части хранимой процедуры?

Большое спасибо заранее!

Ответы [ 3 ]

5 голосов
/ 14 мая 2009

У меня нет времени, чтобы смоделировать это, поэтому я не знаю, сработает ли это, но попробуйте назвать вашу таблицу «## mytemptable» вместо «# mytemptable»

Я предполагаю, что ваша проблема в том, что ваша таблица больше не находится в области видимости после того, как вы выполните exec () строку sql. Временные таблицы, перед которыми стоят два символа фунта, доступны по всему миру.

Не забудьте бросить его, когда закончите!

2 голосов
/ 22 июня 2010

Вы можете использовать его в той же области, включая весь сценарий в динамическом запросе:

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
2 голосов
/ 29 апреля 2010

Я делал это в прошлом так: Сначала создайте #temp_table с помощью CREATE TABLE. Во-вторых, постройте динамический запрос, как обычно, вставив в #temp_table В-третьих, используйте exec sp_executesql @ sql.

При использовании этого метода вам не понадобится глобальная область видимости ## temp_table.

...