Sql server 如何在动态创建诱惑后访问诱惑

Sql server 如何在动态创建诱惑后访问诱惑,sql-server,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将在运行时为eg@db1='gsig_ref'提供 如

我正在使用这个声明

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将在运行时为eg@db1='gsig_ref'提供

如果我说从db1中选择*。。。上面写着无效的对象。 请帮助我如何从db1访问数据。。因为我在另一个查询中使用了它,比如

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

如何在上面的查询中访问db1,并且@p1也是此过程的输入变量,我应该将其用于不同的@p1..

您不能引用EXEClike语句中声明的变量,比如该语句之外的temp tables语句。

您不能访问动态SQL中声明的temp表

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

在您的示例中,这将成为

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脚本并将其应用于temp表,使其结构与源表匹配,但这可能比您愿意承担的更复杂

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


最好退一步,重新评估您正在尝试解决的问题是否是最佳解决方案。

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

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

declare @sql varchar(max);
set @sql = 'select into #t1 ....; select * from #t1';
exec (@sql);
如果我读到了,我想知道为什么你的外部程序甚至需要临时表,但这可能有很好的理由


另一种选择是,如果您确定同一时间只执行一个调用,则使用全局临时表。它们是用双散列来声明的,就像诱惑一样。全局临时表在其过程结束后仍然有效,但可以从多个会话中引用。

在动态sql之前提前创建临时表,然后使用动态sql进行填充

请参阅中的第4种方法


希望这有帮助

::。。。应该更高吗?:'哈珀,谢谢你的建议。但是,@db1不是一个单独的表。它不断变化,我不能为一个表创建表db1,因为@db1的每个值的结构都会发生变化。所以,我之前有过这个选择,我放弃了,因为它对我来说不起作用。还有其他建议吗。。我能够通过将临时表创建为常规表并在末尾删除它们来解决临时表。但是我有一个select语句,它是select DISTINCT@p1 as col1 INTO CUS_name FROM db1,其中@p1不在db2中,当@p1='name'时,按大小写选择@p2;当@p1='param'时,则@p1 else@p1 end;如果指定select DISTINCT,则显示的错误是ORDER BY项必须出现在选择列表中。实际上,@p1作为参数发送到此进程,它可能在运行时发生更改。在这种情况下如何处理?对于@p2也是这样吗??请帮忙。谢谢,拉姆