首页 文章

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

提问于
浏览
0

我无法找到问题的完整解决方案 . 我有一个现有的存储过程,它将动态输入作为参数值 . 我需要执行此过程(使用动态变量)并且想要以某种方式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” .

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

2 回答

  • 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;
    
  • 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
    

相关问题