这是问题所在。
我有一个存储过程可以将规范化数据转换为标准数据集。
我需要报告一些由视图组成的数据,并且来自存储过程的两个数据集将不同的参数提交给返回不同列的存储过程。
实施例
如果我的观点包含类似的内容:
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表明我得到了我想要的东西。
我所要做的就是重复其他参数的过程,并在同一个存储过程中获取我的两个数据集。
答案 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一起粉碎。这将非常快,甚至可以设置为“按需”运行,因此内存和处理占用空间应该很小。
您是否需要一个如何执行此操作的示例 - 或者建议是否足够?