2014-07-25 172 views
0

我有两个相当大且复杂的存储过程。我想从第一个存储过程调用第二个存储过程。例如:从另一个存储过程调用存储过程

-- stored_procedure_one 
select tb1.col1, tb1.col2, sp1.col3, sp1.col4 
from table1 tb1 
inner join stored_procedure_two sp1 on sp1.col1 = tbl1.col1 

与SQL有类似的可能性,因为上面的脚本给了我一个无效的对象错误消息。

在这个例子中使用临时表并不好,因为如果我这样做了,只需要一个小时就可以用第二个存储过程中的所有数据填充临时表。我只希望存储过程返回所需的数据。

+1

你是否真的需要基于某些ID的全部5000万行或总计输出记录?你可能应该重新考虑你的查询并创建一个更适合这个特定情况的查询,而不是尝试将两个单独的查询混合到一些frankenstein查询中,因为你不想重构。花费的时间可能是值得的。 –

回答

3

这是行不通的添加第二个过程的结果。您无法加入存储过程。但是,您可以考虑将stored_procedure_two更改为table-valued user defined function。然后,您可以通过交叉申请“加入”。我多次做到这一点,并且工作得很好。

如果第二个存储过程太大又复杂,则可能无法将其转换为UDF。在这种情况下,我认为你唯一的选择是将第二个存储过程的结果保存到一个表中并加入。但是这可能会有些低效和混乱。

+0

这听起来比使用预填充5000万个临时表更合理行。我会立即检查出来。谢谢。 – oshirowanen

+0

会有可能吗?即在视图中具有存储过程二的复杂性,然后在存储过程中与视图内部联接一个? – oshirowanen

+0

我们需要看到程序告诉你 – OGHaza

0

你可能在一个局部变量表

DECLARE @Table TABLE 
(
    Col1 int, 
    Col2 ... 
) 

INSERT INTO @Table 
EXEC stored_procedure_two 

select tb1.col1, tb1.col2, sp1.col3, sp1.col4 
from table1 tb1 
inner join @Table tbl2 on sp1.col1 = tbl1.col1 
+0

正如我在我的问题的最后一段中试图解释的那样,我不认为这对我的具体情况是非常实际的。 – oshirowanen

+0

Yeap,现在注意到了。那么,如果你想要sp,这是一个办法。另一种方式是建议有一个表值函数。但即使这样也会导致两次使用相同的代码。 –

+0

@OGHaza,我不能这样做,因为如果我在整个运行存储过程2时,大约需要一个小时,这就是为什么我只想运行基于存储过程1和内部联接的一部分,存储过程所需的两项数据。 – oshirowanen

相关问题