2010-03-30 70 views
1

我导入查询的中间结果,用于进一步使用一个临时表,所以就用一个#temp表,以保持相同的模式动态创建#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

+0

如果您运行@selectstatement确实是返回行吗? – 2010-03-30 03:42:37

回答

3

这是因为EXEC声明的范围是含有存储过程的范围不同。也就是说,您拨打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

一旦动态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) 
+0

感谢你们所有人, 我用了golbal temp table解决了我的问题。 很好学习全部 谢谢 prav – prav 2010-03-30 04:50:46

+1

记住全局临时表可以被其他会话中的其他用户访问。你最终可能会有两个用户做同样的事情并相互影响。 – HLGEM 2010-03-30 17:10:58

0

会执行exec(@TEMPSCHEMA)不同的上下文中运行你的程序,因此#TEMP停止执行完成后立即存在?

是啊,here it is

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

我输入查询的中间结果到一个临时表的进一步使用

那部分几乎总是错误的。你能分享下一步或两步计划做什么吗?可能性是,我们可以重写所有发生在同一个语句中。

1

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