动态创建#temp表,然后用于插入数据

时间:2010-03-30 03:35:38

标签: sql sql-server-2008

我将查询的中间结果导入临时表以供进一步使用,因此我使用#temp表来维护与

相同的模式
select * into # temp from schema.tableName where 1<>1;

insert into # temp from exec(table)

虽然我将此语句作为变量来传递不同的tableName但它不起作用

SET @TEMPSCHEMA = 'SELECT * INTO #temp FROM ' + @PKSchema + '.dbo.' + @PKTableName + ' WHERE 1<>1;'

exec(@TEMPSCHEMA)


INSERT INTO #temp

EXEC ( @SELECTSTATEMENT

)

但是在exec语句之后它没有将值带到临时表。

显示无效的对象ID #temp

5 个答案:

答案 0 :(得分:3)

这是因为EXEC语句的范围与包含的sproc的范围不同。也就是说,您对EXEC的调用正在创建临时表,然后它将自动删除,因为EXEC的范围仍然存在。你基本上必须在一个 EXEC语句中完成所有操作:

DECLARE @sql VARCHAR(MAX)
SET @sql = 'SELECT * INTO #temp
            FROM ' + @PKSchema + '.dbo.' + @PKTableName + ' WHERE 1<>1
            INSERT INTO #temp ...'

EXEC(@sql)

答案 1 :(得分:1)

动态SQL完成执行后,本地临时表超出范围。

你必须做这样的事情:

-- everything w/ dynamic sql
SET @TEMPSCHEMA = '
  SELECT * INTO #temp FROM ' + @PKSchema + '.dbo.' + @PKTableName + ' WHERE 1<>1;
  INSERT INTO #temp EXEC (@SELECTSTATEMENT)
  SELECT .... -- whatever else you need to do
  '

exec sp_executesql @TEMPSCHEMA, N'@SELECTSTATEMENT NVARCHAR(MAX)', @SELECTSTATEMENT

-- global temp table rather than local
SET @TEMPSCHEMA = 'SELECT * INTO ##temp FROM ' + @PKSchema + '.dbo.' + @PKTableName + ' WHERE 1<>1;'
exec(@TEMPSCHEMA)

INSERT INTO ##temp EXEC (@SELECTSTATEMENT)

答案 2 :(得分:1)

  

我将查询的中间结果导入临时表以供进一步使用

这部分几乎总是一个错误。你可以分享下一步或下两步你打算做什么吗?可能性很大,我们可以在同一个声明中重写这一切。

答案 3 :(得分:1)

不支持运行必须使用into语句将数据插入临时表的动态语句。先创建临时表,然后使用动态查询插入临时表将正常工作。原因是当使用exec()语句在子上下文中运行时,一旦上下文关闭,动态临时表也会丢失。

答案 4 :(得分:0)

exec(@TEMPSCHEMA)会在你的程序的不同上下文中运行,因此一旦exec完成,#temp就不再存在了吗?

啊,是的,here it is

  • 在存储过程或触发器中,包含临时表名称的所有语句都必须引用在同一存储过程中创建的临时表。无法在调用或调用的存储过程中创建临时表,也无法在使用EXECUTE或sp_executesql执行的字符串中创建临时表。