2

我正在尝试编写一个存储过程,它将一个 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?

提前谢谢了!

4

3 回答 3

5

我没有时间对此进行模拟,所以我不知道它是否会起作用,但请尝试将您的表称为“##mytemptable”而不是“#mytemptable”

我猜你的问题是在你 exec() sql 字符串之后你的表不在范围内。以两个磅符号开头的临时表是全局可访问的。

完成后别忘了放下它!

于 2009-05-14T14:53:43.493 回答
2

我过去这样做的方法是:首先,使用 CREATE TABLE 创建#temp_table。其次,像往常一样构建动态查询,插入#temp_table 第三,使用 exec sp_executesql @sql。

使用此方法,您将不需要全局范围的##temp_table。

于 2010-04-29T00:42:15.083 回答
2

您可以在同一范围内使用它,包括动态查询中的整个脚本:

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
于 2010-06-22T15:32:41.367 回答