CTE не работают, если в запросе есть условие ЕСЛИ - PullRequest
0 голосов
/ 29 марта 2012

Я пытаюсь добавить функциональность в мой запрос, чтобы выбрать, какой запрос будет выполняться при определенном условии.

DECLARE @Test VARCHAR(50)
    SET @Test = 'A'

;WITH A AS (
  Select 'A is Selected' as SELECTED),
      B AS (
  Select 'B is Selected' as SELECTED)

IF(@Test = 'A')
  select * from A

IF(@Test <> 'A')
  select * from B

На мой пример кода теста выше я получил:

Сообщение 319, Уровень 15, Состояние 1, Строка 5
Неверный синтаксис рядом с ключевым словом «с». Если этот оператор является общим табличным выражением или предложением xmlnamespaces, предыдущий оператор должен заканчиваться точкой с запятой.

Сообщение 102, Уровень 15, Состояние 1, Строка 8
Неверный синтаксис рядом с ','.

Может быть, я что-то упустил?

Ответы [ 2 ]

4 голосов
/ 29 марта 2012

С С common_table_expression (Transact-SQL) .

определено в пределах области выполнения одного SELECT, INSERT, UPDATE, или УДАЛИТЬ оператор.

Полагаю, вы хотите что-то подобное.

declare @Test varchar(50);
set @Test='A';

with A as
(
  select 'A is Selected' as SELECTED
),
B as
(
  select 'B is Selected' as SELECTED
)
select *
from A
where @Test = 'A'    
union all
select *
from B
where @Test = 'B';
1 голос
/ 29 марта 2012

Мне кажется, что вы должны просто поместить оба запроса в оператор IF следующим образом:

IF (@Test = 'A')
  select * from A
ELSE
  select * from B
...