使用带有动态参数的过程SELECT INTO动态临时表

时间:2018-06-14 15:38:15

标签: sql sql-server

我无法找到问题的完整解决方案。我有一个现有的存储过程,它将动态输入作为参数值。我需要执行此过程(使用动态变量)并且想要以某种方式SELECT * INTO #mytable而不必声明临时表的模式。

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

select * into #table from openrowset('SQLNCLI', 'Server=localhost;Trusted_Connection=yes;', 'exec SERVER..MYSTOREDPROCEDURE @parameter = 123')

我唯一知道的另一种方法是将它包装在一个字符串中并使用EXEC(@sql),但我无法弄清楚如何" SELECT * INTO#table&#34 ;从那以后。

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

2 个答案:

答案 0 :(得分:0)

我猜这里,但你需要在动态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;

答案 1 :(得分:0)

我想我明白了。我真的只需修改临时变量名称就可以将临时表放入全局范围。这适用于我的实际表格(我为了这篇文章的目的将其重命名)。

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