2014-02-19 63 views
1

我试图将两个存储过程合并为一个。以前我有:我可以在存储过程中返回附加值以及SQL数据吗?

@argument int 

SELECT val1, val2, val3 
    FROM table as x 
     INNER JOIN(
        ...) as y 
        ON x.val1 = y.val2 
WHERE someCondition = @argument 

然后,我会触发一个几乎相同的存储过程,其中唯一的区别是条件。

我想找到一种方法,这些方法结合起来,创造这样的事情:

@argument int 

SELECT val1, val2, val3, 
     isCondition1 = true -- Additional return value 
    FROM table as x 
     INNER JOIN (
        ...) as y 
        ON x.val1 = y.val2 
    WHERE someCondition = @argument 

SELECT val1, val2, val3, 
     isCondition1 = false -- Additional return value 
    FROM table as x 
     INNER JOIN(
      ...) as y 
      ON x.val1 = y.val2 
    WHERE someOtherCondition = @argument 

这可能吗?

回答

2

有一个存储过程可以返回可变数量的列是不是一个好主意。

但它看起来像2个查询中的additional return values是compatable?

如果结果列的数量,类型或名称不同,那么我会保持2存储过程的,但我会干涸视图中的,然后使用两个特效的共同繁重

CREATE VIEW vwWithCommonWork 
    AS 
    SELECT val1, val2, val3, -- any other useful common columns here 
    FROM table as x 
    INNER JOIN(
    ... 
    ) as y ON x.val1 = y.val2 
    -- No WHERE 

的特效然后消耗的观点:

PROC 1

SELECT val1, val2, val3, isCondition1 = 'true' 
FROM vwWithCommonWork 
WHERE someCondition = @argument 

Proc 2

SELECT val1, val2, val3, isCondition1 = 'false' 
FROM vwWithCommonWork 
WHERE someOtherCondition = @argument 
+0

这是完全可以接受的,我将以某种身份使用它。谢谢!回答你的问题,是的。在我原来的问题中,我所要求的解决方案将返回相同数量的列。这两个查询都会返回一个布尔值。那可以吗?我可以帮你解答一下吗? – drewwyatt

+1

如果你确实返回相同的列,那么你仍然可以使用一种技术[像这样](http://stackoverflow.com/a/3415629/314291)来组合PROC,但是,它带来了是否需要使用if/else分支并有2个单独的查询(对参数嗅探不好)或带有可选过滤器模式(对查询计划不合适)或动态sql(臭)的单个查询。另一个[这里的例子](http://stackoverflow.com/q/11329823/314291)(我假设sql-server,顺便说一句) – StuartLC

相关问题