我正在尝试使用使用动态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中正常工作的相同方法,但是我不知道为什么有必要这样做,并且希望使用更干净的解决方案。
答案 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