如何根据传递的参数选择Union ALL(需要优化)?

时间:2010-12-12 05:41:06

标签: sql stored-procedures query-optimization

假设我们有一个存储过程,它带有@IsAllowed参数,它是布尔值,如果它传递True,我应该从两个表A,B中选择数据(我会用在我的case Union ALL)否则它传递False我应该从一个表A中选择数据......我按照以下方式编写它:

Create PROCEDURE TestSP
(
    @IsAllowed bit
)
AS

IF @IsAllowed = 1
BEGIN
    Select ID, Username From A
    Union ALL
    Select ID, Username From B
END
ELSE
    Select ID, Username From A

这是最好的方法吗?虽然在我的实际案例中,SP在第一个查询的条件中使用了大约9个参数,这意味着我将编写第一个查询两次并且任何更改在其中我必须注意在两个不同的地方有相同的副本

2 个答案:

答案 0 :(得分:0)

试试这个。

SELECT *
FROM   A
UNION ALL
SELECT *
FROM  B
WHERE @isAllowed = 1

答案 1 :(得分:0)

我对这个查询并不是很疯狂,但是如果你想完全避免二次选择的成本,我认为你必须将它换成临时表。

IF OBJECT_ID('tempdb..#tableA') IS NOT NULL 
    DROP TABLE #tableA

SELECT  ID,Username
INTO    #tableA
FROM    tableA

IF @isAllowed = 1 
    BEGIN
        SELECT  ID,Username
        FROM    #tableA
        UNION ALL
        SELECT  ID,Username
        FROM    B
    END
ELSE 
    BEGIN
        SELECT  ID,Username
        FROM    #tableA
    END

DROP TABLE  #tableA

如果您的记录集足够小以至于您不介意放入内存(而不是将其写入磁盘 - 我可以随意将#表更改为@表/ O是主要瓶颈之一)。请记住,您必须实际声明表格(使用列定义),而不是SELECT INTO