动态创建后如何访问临时表

时间:2010-01-15 08:48:09

标签: sql-server

我正在使用声明

SELECT    * 
INTO      #gsig_ref  
FROM      gsign 
WHERE     [name] NOT LIKE 'RESERVE%' OR [name] NOT LIKE 'Spare%'



EXECUTE('SELECT * INTO #db1 FROM ' + @db1)
EXECUTE('SELECT * INTO #db2 FROM ' + @db2)

其中@db1将在运行时提供(例如@db1 = '#gsig_ref'

如果我说select * from #db1 ...它说的是无效的对象。 请帮助我如何访问#db1中的数据..因为我已在其他查询中使用此功能,如

SELECT        DISTINCT @p1 INTO #curs_name
FROM          #db1 
WHERE         @p1 NOT IN (SELECT @p2 FROM #db2)
ORDER BY      @p1

如何在上述查询中加入#db1@p1是此过程的输入变量,我应该将其用于distinct @p1 ..

请帮我解决这个问题 谢谢 RAMM

由于 RAMM

4 个答案:

答案 0 :(得分:2)

当过程结束时,将删除在存储过程中创建的本地临时表;其他存储过程或调用进程无法看到它们。

您可以生成整个SQL,有效地将临时表移动到动态SQL,如:

declare @sql varchar(max);
set @sql = 'select into #t1 ....; select * from #t1';
exec (@sql);

如果我读到这个,我想知道为什么你的外部程序甚至需要临时表,但可能有充分的理由。

如果您确定只同时执行一个调用,则另一个选项是使用全局临时表。它们使用双重哈希声明,如##TempTable。全局临时表在其过程结束时仍然存在,但可以从多个会话中引用。

答案 1 :(得分:1)

您无法访问在动态SQL中声明的临时表。

但是,如果在运行动态查询之前创建临时表,则可以在该动态查询中引用它。

在您的示例中,这将成为

CREATE TABLE #db1
(...table definition...)

CREATE TABLE #db2
(...table definition...)

EXECUTE('INSERT #db1 SELECT * FROM ' + @db1)
EXECUTE('INSERT #db2 SELECT * FROM ' + @db2)

您还需要构建并执行第二个查询(使用@p1)作为动态SQL,因为您希望使用变量作为列名称的占位符。

修改

如果源表的结构不同,则没有简单的方法可以修改此解决方案。

您可以编写一些代码来查询信息模式,以生成动态ALTER TABLE脚本并将其应用于临时表,使其结构与源表匹配,但这可能比您愿意采用的更复杂上。

Andomar建议在动态SQL中执行整个操作可能更合适。

退一步并重新评估您尝试做的事情是否是解决您正试图解决的任何问题的最佳解决方案可能是一个好主意。

答案 2 :(得分:0)

您不能引用在该语句之外的EXEC(如临时表)声明中声明的变量。

答案 3 :(得分:0)

在动态sql之前预先创建临时表,然后使用动态sql填充。

参考http://www.nigelrivett.net/SQLTsql/AccessTempTablesAcrossSPs.html

中的第4种方法

希望这有帮助!