Sql 使用带有动态参数的过程选择到动态临时表中

Sql 使用带有动态参数的过程选择到动态临时表中,sql,sql-server,Sql,Sql Server,我找不到完全解决我问题的办法。我有一个现有的存储过程,它将动态输入作为参数值。我需要用一个动态变量执行这个过程,并希望以某种方式将*选择到mytable中,而不必声明临时表的模式 我尝试过使用OPENROWSET,但它不允许我指定变量,只能对其进行硬编码: select * into #table from openrowset('SQLNCLI', 'Server=localhost;Trusted_Connection=yes;', 'exec SERVER..MYSTOREDPROCEDU

我找不到完全解决我问题的办法。我有一个现有的存储过程,它将动态输入作为参数值。我需要用一个动态变量执行这个过程,并希望以某种方式将*选择到mytable中,而不必声明临时表的模式

我尝试过使用OPENROWSET,但它不允许我指定变量,只能对其进行硬编码:

select * into #table from openrowset('SQLNCLI', 'Server=localhost;Trusted_Connection=yes;', 'exec SERVER..MYSTOREDPROCEDURE @parameter = 123')
我所知道的唯一的另一种方法是将其包装成字符串并使用EXEC@sql,但我不知道如何从中选择*到表中


我有什么选择?我可以创建一个可以返回动态表的UDF表函数吗?可疑…

我在这里猜测,但您需要在动态SQL中完成整个工作。因此,取而代之的是:

DECLARE @SQL nvarchar(MAX);
DECLARE @param nvarchar(10) = 123;
SET @SQL = N'SELECT *' + NCHAR(10) +
           N'INTO #table' + NCHAR(10) +
           N'FROM OPENROWSET(''SQLNCLI'', ''Server=localhost;Trusted_Connection=yes;'', ''exec SERVER..MYSTOREDPROCEDURE @parameter = ' + QUOTENAME(@param,N'''') +N''');' + NCHAR(10) +
           N'SELECT *' + NCHAR(10) + --Of course, I assume you're doing something more complex that a SELECT *.
           N'FROM #table;';
PRINT @SQL;
EXEC sp_executesql @SQL;

我想我明白了。我实际上只需要修改temp变量名,就可以将temp表放入全局范围。这适用于我的实际表格,我为这篇文章重新命名了它们

IF OBJECT_ID ('tempdb..##mytemptable') is not null drop table ##mytemptable

declare @id int = 112

declare @sql nvarchar(max) ='SELECT * INTO ##mytemptable FROM OPENROWSET(''SQLNCLI'', ''Server=localhost;Trusted_Connection=yes;'', ''exec SERVER..MyStoredProcedure @ID =' + convert(varchar(10), id) + ''')'

-- invokes and inserts into ##mytemptable
exec sp_executesql @sql

-- now I can query from the global scope
select * from ##mytemptable

我真的不明白这里有什么问题?如果创建临时表并在同一连接中执行动态SQL,则可以引用它。例如:创建表testid int;EXEC sp_executesql N'插入测试值1;';从测试中选择*;跌落台试验@Larnu我想我找到了,他不想声明临时表的模式。如果您能够创建一个未知的模式,那么您的代码的其余部分打算如何使用这个表?这就是我所看到的,但是如何从exec语句之外访问这个表?该表不是在tempdb中创建的吗?在执行了要插入到表中的第一条语句之后,我似乎无法访问该表。@RyanPeters您无法访问在动态SQL外部的动态SQL内部创建的临时表,但是,如我的原始注释所示,情况正好相反。因此,您最好先进入tempdb..[table],然后使用DROP table tempdb。。[附表];在批处理结束时。你知道你必须小心。如果代码从不同的连接运行到不同的源/过程,你的结果可能不可预测。对。谢天谢地,这将是一个每天一次的过程。那么为什么不使用一个暂存表或一系列暂存表:每个过程一个?这样会更快一个创建临时表的数据库只能在该数据库的范围内可见。