1

这是问题所在。Sql Server从存储过程加入结果集

我有一个存储过程,将标准化数据转换为标准数据集。

我需要报告由视图组成的一些数据,以及来自存储过程的两个数据集,其中不同的参数被提交给返回不同列的存储过程。

如果我的观点包含类似:

ID Title Status Date 
1 How To Party Like a rockstar Approved 7/15/1989 
2 Too much of a good thing Approved 7/25/2001 
3 Needs More Cowbell Denied 11/11/2011 
4 Here Today Gone Tommorrow Approved 8/13/1969 
5 The way She moves Approved 12/13/2011 

并与一个paramater返回程序运行:

ID Do you like the ice Cream? How much would you pay for the ice cream? 
1 Yes 2 
2 Yes 5 
3 Yes 7 
4 No 2 
5 No 3 

并用不同的参数返回相同的程序运行:

ID Total Number of Bell Peppers Total Number of Apples Total Number of Oranges 
1 7 6 6 
2 6 8 8 
3 32 7 5 
4 7 3 1 
5 12 1 1 

假设ID列是可用于连接数据集的关键,如何将我去得到:记住

ID Title Status Date Do you like the ice Cream? How much would you pay for the ice cream? Total Number of Bell Peppers Total Number of Apples Total Number of Oranges 
1 How To Party Like a rockstar Approved 7/15/1989 Yes 2 7 6 6 
2 Too much of a good thing Approved 7/25/2001 Yes 5 6 8 8 
3 Needs More Cowbell Denied 11/11/2011 Yes 7 32 7 5 
4 Here Today Gone Tommorrow Approved 8/13/1969 No 2 7 3 1 
5 The way She moves Approved 12/13/2011 No 3 12 1 1 

饲养的存储过程不能直接插入SQL来完成,由于归一化的性质和归一化的转换,我不相信它们可以作为表变量udf来完成,因为存储过程根据传递给它的参数返回可变数量的列它运行(如果有人可以证明我错了这一点,并指向我的动态列表udf值,我会很感激)

如果我可以将视图和两个存储过程放入一个存储过程并以该方式返回数据集,那将是我的最终目标。

我还需要一提的是特设分布式查询无法打开此服务器上(不是我的决定)

分辨率

与斯图尔特安斯沃思的回答有点帮助,我的工作出来。我最初的问题是,每个交叉表的列都是动态的。这样的一个部分,我已经创建了返回的列作为一个逗号deliminated字符串函数...

 DECLARE 
      @PivotColumns VARCHAR(MAX) 

     SET @PivotColumns = dbo.fnGetFormPivotColumns(9) 

凡在这种情况下,9是一个让我知道我在为建设哪些项目参数。从那里,它只是一个在基本SP动态地建立临时表的功能重复,所以我想出了这个:

IF object_id('tempdb..#temp_DEP') IS NOT NULL 
    DROP TABLE #temp_DEP 


CREATE TABLE #temp_DEP (APPLICATION_ID int) 
EXEC ('ALTER TABLE #temp_DEP ADD ' + @PivotColumns) 

INSERT INTO #temp_DEP 
    EXEC GetFormCrossTab 9 

一个简单的SELECT * FROM #temp_DEP表明,我得到什么我想。

我所要做的就是重复其他参数的过程,并在同一个存储过程中获得两个数据集。

+0

我想你会遇到的挑战是从PROC您的可变输出。 http://stackoverflow.com/questions/653714/how-to-select-into-temp-table-from-stored-procedure如果它是一个一致的形状,你可以插入结果到一个表和混搭结果像这样。否则,我认为你正在寻找复制粘贴继承来将所有的逻辑组合在一起。 – billinkc

+0

我应该很遗憾地添加Ad Hoc分布式查询已关闭,我将无法打开它,所以openrowset/opendatasource不是选项。 – Patrick

回答

1

你可以建立一个存储过程,使用IF语句,以满足您的每一个参数,例如:

CREATE PROC someproc @parameter AS 

CREATE TABLE #scratch1 (columns)... 
CREATE TABLE #scratch2 (columns)... 

IF @parameter = 1 
BEGIN 
INSERT INTO #scratch1 
exec oldproc @parameter 
END 

IF @parameter = 2 
BEGIN 
INSERT INTO #scratch1 
exec oldproc @parameter 
END 


SELECT * 
FROM view v 
LEFT JOIN #scratch1 s1 ON v.ID =s1.ID 
...etc 
+0

我宁愿动态构建临时表...理论上可以有无限数量的参数...然后再次为这个报告它只会是2特定项目...所以这可能是可行的这个特定的报道,我只是希望有一个更有活力的解决方案。 – Patrick

+0

更何况,我的存储过程之一返回类似13列和列名的字眼往往会改变 – Patrick

+0

实际上......如果我从基础sp的代码动态地构建临时表...并把它放入这个家长的报告,它应该工作...生病了吧。 – Patrick

1

您可以使用条件结果集的存储过程将其结果插入到两个临时表之一中,具体取决于传入的参数吗?

然后,您可以创建另一个存储过程,将您的视图连接到临时表。

E.G,这将是新的存储过程:

exec stored_proc_with_conditional_output 

select * from 
view v 
left outer join scratch1 s1 on v.ID = s1.ID 
left outer join scratch2 s2 on v.ID = s2.ID 
+0

我可以看到使用该参数创建临时表以使其唯一,然后从中查询......但是当调用sp完成时临时表不会被销毁?它的一个想法虽然......也许一个全球临时表将存活足够长的时间来使用... – Patrick

+0

临时表可能会限制到单个存储区。如果是这样,你将不得不使用一个实际的表并考虑并发性问题,如果你的sproc可以一次调用多次。如果您使用SQL Server 2008及更高版本,则还可以查看使用表变量的可能性。 – jmacinnes

+0

我会使用一个表变量,但我无法找到一种方法来动态去除它们......即使我正在构建临时表...如果我确实想到了如何使用它,您会建议我使用它吗?作为存储过程的输出参数?甚至可以工作吗? – Patrick

0

您应该运行查询和使用LINQ一起粉碎他们。这将会非常快,甚至可以设置为“按需”运行,因此内存和处理空间应该很小。

你需要一个如何做到这一点的例子 - 或者是足够的建议吗?

+0

如果我在.net中使用它,它可能不会是一个问题......但他们需要去SSRS报告......并且我不确定要将linq实现为ssrs(如果它甚至可能,我不知道) – Patrick

+0

@帕特里克 - 采取的措施 - 我将它留在这里作为将来可能会发现它有用的人的参考。 – Hogan

相关问题