Sql Server连接存储过程的结果集

时间:2011-12-07 20:27:45

标签: sql stored-procedures sql-server-2008-r2 user-defined-functions

这是问题所在。

我有一个存储过程可以将规范化数据转换为标准数据集。

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

实施例

如果我的观点包含类似的内容:

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

用一个参数运行的程序返回:

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我会非常感激)

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

我还需要提一下,无法在此服务器上启用Ad Hoc Distributed Queries(不是我的决定)

解决

在Stuart Ainsworth的回答的帮助下,我能够解决这个问题。我最初的问题是每个交叉表都是动态列。所以作为其中的一部分,我创建了一个函数,将列作为逗号分隔的字符串返回...

        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表明我得到了我想要的东西。

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:0)

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

您是否需要一个如何执行此操作的示例 - 或者建议是否足够?