2016-07-24 2 views
0

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

Что-то вроде процедуры, который принимает флаг @reportType int

SELECT 
    a, b, c, d, e, f, g, h,... and so many 
FROM 
    CASE 
     WHEN @reportType = 1 
      THEN table 
      ELSE View 
    END 
INNER JOIN 
    and so on.. 

Мне нужно писать, как и выше, но это метания ошибку

Неправильный синтаксис около ключевого слова «ДЕЛО»

+0

AFAIK, выражение case возвращает значение, а не идентификатор. это не может быть сделано так, только с использованием динамического sql или if if else. –

+0

Я редактирую ваш вопрос, что вы можете отбросить все назад;). –

+0

То же, что и: [Выбрать любую из двух таблиц] (http://stackoverflow.com/questions/36857438/select-from-either-of-two-tables/36860365) –

ответ

1

в хранимой процедуре, вы должны нам е если заявление вместо:

if @reportType=1 
    SELECT a,b,c FROM myTable 
else 
    SELECT a,b,c FROM myView 
+0

Да, но в моем случае SELECT a, b , c будет таким же, но myTable и myView будет условным, и запрос слишком длинный, чтобы его можно было наплевать. –

+0

Тогда я могу только подумать о двух вариантах. 1) Сделайте это с помощью динамического SQL (присвойте текст запроса «varchar» и выполните его). Или 2) Создайте представление с содержимым обеих таблиц и добавьте условие в 'where', которое фильтрует соответствующую таблицу. – Andrew

+0

Я думаю, что я должен пойти на условие IF else, потому что два пути будут трудоемкими. –

1

На самом деле это не выглядит как хороший дизайн, но если вы должны работать с этим и желаете, чтобы избежать копирований прошлого, вы можете попробовать условный КТР с конечным союзом или одного подзапроса с союзом имитировать единый источник для окончательного запроса:

;with Source_1 as 
(
    select ... 
    from myTable 
    where @reportType=1 
), 
Source_2 as 
(
    select ... 
    from myView 
    where @reportType=2 
), 
FullSource 
(
    select ... 
    from Source_1 
    union all 
    select ... 
    from Source_2 
) 
select ... 
from FullSource src 
inner join ... 

или

select ... 
from 
(
    select ... 
    from myTable 
    where @reportType = 1 

    union all 

    select ... 
    from myView 
    where @reportType = 2 
) src 
inner join ... 

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

0

Вы можете использовать динамический SQL, как показано ниже:

DECLARE @reportType INT 
SET @reportType = 1 

DECLARE @q VARCHAR(max)= 'SELECT 
a, b, c, d, e, f, g, h,... and so many 
FROM '+ 
CASE 
    WHEN @reportType = 1 
     THEN 'table ' 
     ELSE 'View ' 
END+' 
INNER JOIN 
and so on..' 

EXEC(@q) 

Вы также можете использовать sp_executesql для того, чтобы сделать параметрический запрос и предотвратить возможную инъекцию SQL.

0

Я думаю, что вам нужен запрос, как это:

;WITH mixedData AS (
    SELECT yourFields, 1 As reportType 
    FROM yourTable 
    UNION ALL 
    SELECT yourFields, 2 AS reportType 
    FROM yourView 
) 
SELECT * 
FROM mixedData 
INNER JOIN yourJoinParams 
WHERE mixedData.reportType = @reportType; 

или

... 
WHERE mixedData.reportType = 
     CASE WHEN @reportType = 1 THEN 1 ELSE 2 END; 

Заметьте, что yourFields из yourTable и yourView одинаковы.

HTH

Смежные вопросы