2016-12-11 3 views
-1

Можно ли определить предложение WITH в хранимой процедуре и использовать его в операторах if else, потому что я всегда получаю сообщение об ошибке?SQL с предложением в хранимой процедуре

BEGIN 
    WITH Test (F, A) AS 
    (
     SELECT FM.ID, FM.Name 
     FROM [Test.Abc] FM 
     INNER JOIN [Organization] O on O.ABCID = FM.ID 
    ) 

    IF(@var = 'case1') 
    BEGIN 
     SELECT * 
     FROM Test F 
     WHERE NOT F.ID = 'someID' 
    END 

Я всегда получаю ошибку «Неверный синтаксис» до того, как если оператор

Если я переместить с пунктом в заявлении, если он работает нормально. Но мне нужно, чтобы внешний оператор out использовался для повторного использования в разных операторах if else.

+0

Вам лучше описать весь сценарий. Сейчас это выглядит странно: ваш sp может возвращать набор результатов, а может и не делать этого. Как с этим работать? –

ответ

1

Вот другая версия тех же ответов, вы получаете:

Ваш withcommon table expresson должен быть в том же заявлении, что и запрос, который вызывает его, и он должен ссылаться на запрос (или другой cte), либо это синтаксическая ошибка.

Ссылка на документацию Руководящие принципы для Создание и использование Common Table Expressions.

BEGIN -- doing stuff 
-- .... doing stuff over here 
IF(@var = 'case1') 
    BEGIN 
     with Test (F, A) as (
     select FM.ID, FM.Name from [Test.Abc] FM 
     inner join [Organization] O on O.ABCID = FM.ID 
     )  
     select * from Test F 
     where not F.ID = 'someID' 
    END 
-- .... and doing some other stuff over here too 
END -- done with this stuff 
1

Просто используйте временную таблицу или таблицу. Правила обзорных из SQL Server убедитесь, что такая таблица обрывается в конце процедуры:

BEGIN 
    select FM.ID, FM.Name 
    into #test 
    from [Test.Abc] FM inner join 
     [Organization] O 
     on O.ABCID = FM.ID; 

    IF(@var = 'case1') 
     BEGIN 
      select * 
      from #Test F 
      where not F.ID = 'someID' 
     END; 

Это имеет то преимущество, что вы можете добавить индексы в таблицу, и это может повысить производительность.

0

WITH не является автономным, он всегда является частью всего заявления и только одним утверждением.
Он не распознается вне рамок заявления.

BEGIN 

    with my_cte (n) as (select 1+1) 
    select * from my_cte 

    -- The following statement yields the error "Invalid object name 'my_cte'."  
    -- select * from my_cte 

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