【发布时间】: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