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也是这样吗??请帮忙。谢谢,拉姆