Как выбрать Union ALL в соответствии с переданным параметром (необходима оптимизация)? - PullRequest
2 голосов
/ 12 декабря 2010

Скажем, у нас есть хранимая процедура, которая принимает параметр @IsAllowed, который является логическим значением, и в случае, если он прошел True, я должен выбрать данные из двух таблиц A,B (я буду использовать в моем случае 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 разных местах

Ответы [ 2 ]

0 голосов
/ 12 декабря 2010

Я не очень люблю этот запрос, но если вы хотите полностью избежать стоимости дополнительного выбора, я думаю, вам придется обменять его на временную таблицу.

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

Не стесняйтесь поменять таблицу # на таблицу @, если ваш набор записей достаточно мал, чтобы вы не возражали поместить его в память (в отличие от записи на диск - ввод-вывод - один из основных узких мест). Просто имейте в виду, что вам придется фактически объявить таблицу (с определениями столбцов), а не SELECT ing INTO.

0 голосов
/ 12 декабря 2010

Попробуйте это.

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