【问题标题】:Sql Server Joining Result sets from stored proceduresSql Server 加入存储过程的结果集
【发布时间】:2012-01-15 08:40:48
【问题描述】:

这就是问题所在。

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

我需要报告一些数据,这些数据由一个视图组成,存储过程中的两个数据集具有不同的参数,它们被提交给返回不同列的存储过程。

例子

如果我的视图包含类似的内容:

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

我所要做的就是对另一个参数重复该过程,然后在同一个存储过程中获取我的两个数据集。

【问题讨论】:

  • 我认为您将遇到的挑战是您从 proc 中输出的变量。 stackoverflow.com/questions/653714/… 如果是一致的形状,您可以将结果插入到表格中,然后像这样将结果混合在一起。否则,我认为您正在研究复制粘贴继承以将所有逻辑位结合在一起。
  • 不幸的是,我应该补充一点,即席分布式查询已关闭,我将无法打开它,因此 openrowset/opendatasource 不是选项。

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


【解决方案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 个特定项目...所以对于这个特定的报告可能是可行的,我只是希望有一个更动态的解决方案。
  • 更不用说我其中一个存储过程返回了类似 13 列的内容,并且列名的措辞往往会经常变化
  • 实际上...如果我从动态构建临时表的基本 sp 中获取代码...并将其放入此父 sp 以获取报告,它应该可以工作...我会尝试破解在它。
【解决方案2】:

能否让带有条件结果集的存储过程根据传入的参数将其结果插入两个临时表之一?

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

例如,这将是新的存储过程:

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

【讨论】:

  • 我可以看到使用参数创建一个临时表以使其唯一,然后从中查询......但是当调用 sp 完成时临时表不会被破坏吗?虽然它是一个想法......也许一个全局临时表可以存活足够长的时间来使用......
  • 临时表的范围可能是单个存储过程。如果是这样,您将不得不使用一个实际的表并考虑并发问题,如果您的 sproc 一次可以被多次调用。如果您使用的是 SQL Server 2008 及更高版本,您还可以研究使用表变量的可能性。
  • 我会使用表变量,但我无法找到动态处理它们的方法......即使我正在动态构建临时表......如果我确实弄清楚了你会如何建议我使用它?作为存储过程的输出参数?那还能用吗?
  • 到目前为止,我读到的内容表明,表变量作为存储过程中的参数是只读输入的。
  • 欢迎使用 StackOverflow:如果您发布代码、XML 或数据示例,在文本编辑器中突出显示这些行并单击“代码示例”按钮 ({ } ) 在编辑器工具栏上很好地格式化和语法突出显示它!
【解决方案3】:

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

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

【讨论】:

  • 如果我在 .net 中使用它可能不会有问题...但他们需要查看 SSRS 报告...我不确定是否尝试实施linq into ssrs(如果可能的话,我不知道)
  • @Patrick - 要点 - 我将把它留在这里,以供将来可能觉得它有用的其他人参考。
猜你喜欢
  • 2014-12-07
  • 1970-01-01
  • 2010-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多