使用动态SQL从存储过程填充临时表

时间:2018-12-13 00:14:42

标签: sql sql-server tsql

我正在尝试使用使用动态SQL执行的存储过程的结果填充预定义的临时表。该临时表位于另一个存储过程中,并在填充后作为结果集的一部分返回。创建表并插入数据的代码如下:

$proc=proc_open($cmd,
        array(
            0=>array('pipe', 'r'), //stdin
            1=>array('pipe', 'w'), //stdout
            2=>array('pipe', 'w')  //stderr
            ),
        $pipes,
        $dir,
        null,
        array('bypass_shell'=>true)
    );

CREATE TABLE #MyTable ( As_Of_Date DATE NULL, Fund VARCHAR(50) NULL, Code VARCHAR(100) NULL, Amount FLOAT NULL ); DECLARE @SQL NVARCHAR(MAX) = ''; SELECT @SQL = @SQL + 'INSERT INTO #MyTable EXEC [dbo].[p_UI_Get_My_Tables_Data] ''' + CONVERT(VARCHAR, As_Of_Date, 23) + ''', ''' + @Fund + ''';' FROM #AsOfDates; EXEC sp_executesql @SQL; SELECT * FROM #MyTable ORDER BY Fund, Code, As_Of_Date; 中的最终声明如下:

p_UI_Get_My_Tables_Data

我尝试从我的应用程序和SQL Server中执行此代码,通常会收到一条错误消息

  

列名或提供的值数与表定义不符

我已经阅读了代码,并尝试自行运行SELECT @AsOfDate AS As_Of_Date, Fund, Code, SUM(Amount) AS Amount FROM #DetailedData GROUP BY Fund, Print_Group; ,据我所知,该表已以正确的格式返回。但是,有一件事我觉得很奇怪。

如果我在SQL Server中打开一个新查询并首先运行我的主要存储过程,则会收到错误消息。但是,如果我自己先运行p_UI_Get_My_Tables_Data,那么我的主存储过程将开始正常工作。它会在SQL Server中继续工作一小会儿,但是从我的应用程序中调用时总是会失败。

我尝试了获取所需数据的其他方法,但没有一种令人满意。我尝试将p_UI_Get_My_Tables_Data切换到全局临时表,但遇到相同的错误。我不能使用表函数,因为@MyTable使用临时表。我试了p_UI_Get_My_Tables_Data,但开始遇到配置错误,并认为这不是最佳解决方案。

我认为有一种方法可以完成我想做的事情,因为它在部分时间内起作用,但是就某些时候为什么它失败了,我必须有所遗漏。有人可以提供任何建议,将不胜感激。

编辑:一项确实有效但显然不理想的事情是从我的应用程序运行OPENROWSET并忽略结果,然后运行实际的存储过程。这是使它在SQL Server中正常工作的相同方法,但是我不知道为什么有必要这样做,并且希望使用更干净的解决方案。

1 个答案:

答案 0 :(得分:0)

我想知道为什么您要使用Dynamic SQL,但以下各项不能做到这一点:

declare @TempTable table (As_Of_Date varchar(10), Done bit default(0));
declare @As_Of_Date varchar(10);

insert into @TempTable
  select CONVERT(VARCHAR, As_Of_Date, 23)
  from #AsOfDates;

while exists (select 1 from @TempTable where Done = 0) begin
  select top 1 @As_Of_Date = As_Of_Date from @TempTable
  INSERT INTO #MyTable
    EXEC [dbo].[p_UI_Get_My_Tables_Data] @As_Of_Date, @Fund;
  update @TempTable set Done = 1 where @As_Of_Date = As_Of_Date
end