2014-02-04 3 views
0

Я работаю над функцией, которая не ведет себя так, как ожидалось. Мне кажется, что это происходит потому, что мои IF заявления не гнездятся, как я ожидал:Правильно вложенные инструкции if в SQL-функции

CREATE FUNCTION primaryTheme (
    @StoryNumber NVARCHAR(10) 
    ,@ProductType NVARCHAR(10) 
    ) 
RETURNS VARCHAR(15) 
AS 
BEGIN 
    DECLARE @return VARCHAR(15) 
    DECLARE @count INT 

    SELECT @count = COUNT(THM.NAME) 
    FROM Theme THM 
    LEFT JOIN ProductTheme PDT ON THM.PK_Theme = PDT.ThemeId 
    LEFT JOIN StoryProductTheme SPT ON PDT.PK_ProductTheme = SPT.ProductThemeId 
    LEFT JOIN Story STY ON SPT.StoryId = STY.PK_Story 
    WHERE STY.Number = @StoryNumber 

IF (@count = 0) 
    IF (@ProductType = 'Sprint') 
     SELECT @return = 'New Development' 
    ELSE 
     SELECT @return = NULL 
ELSE 
    IF (@count = 1) 
     IF (@ProductType = 'Sprint') 
      SELECT @return = THM.NAME 
      FROM Theme THM 
      LEFT JOIN ProductTheme PDT ON THM.PK_Theme = PDT.ThemeId 
      LEFT JOIN StoryProductTheme SPT ON PDT.PK_ProductTheme = SPT.ProductThemeId 
      LEFT JOIN Story STY ON SPT.StoryId = STY.PK_Story 
      WHERE STY.Number = @StoryNumber 

IF (
     @return != 'Adaptive' 
     OR @return != 'Corrective' 
     OR @return != 'Perfective' 
     OR @return != 'Preventative' 
     ) 
    SELECT @return = 'New Development' 
ELSE 
    SELECT @return = THM.NAME 
    FROM Theme THM 
    LEFT JOIN ProductTheme PDT ON THM.PK_Theme = PDT.ThemeId 
    LEFT JOIN StoryProductTheme SPT ON PDT.PK_ProductTheme = SPT.ProductThemeId 
    LEFT JOIN Story STY ON SPT.StoryId = STY.PK_Story 
    WHERE STY.Number = @StoryNumber 

IF (
     @return != 'Adaptive' 
     OR @return != 'Corrective' 
     OR @return != 'Perfective' 
     OR @return != 'Preventative' 
     OR @return != 'New Development' 
     ) 
    SELECT @return = NULL 
ELSE 
    IF (@count > 1) 
     IF (@ProductType = 'Sprint') 
      SELECT @return = THM.NAME 
      FROM Theme THM 
      LEFT JOIN ProductTheme PDT ON THM.PK_Theme = PDT.ThemeId 
      LEFT JOIN StoryProductTheme SPT ON PDT.PK_ProductTheme = SPT.ProductThemeId 
      LEFT JOIN Story STY ON SPT.StoryId = STY.PK_Story 
      WHERE STY.Number = @StoryNumber 
       AND THM.NAME != 'New Development' 
       AND (
        THM.NAME = 'Adaptive' 
        OR THM.NAME = 'Corrective' 
        OR THM.NAME = 'Perfective' 
        OR THM.NAME = 'Preventative' 
        ) 

IF (@return IS NULL) 
    SELECT @return = 'New Development' 
ELSE 
    SELECT @return = THM.NAME 
    FROM Theme THM 
    LEFT JOIN ProductTheme PDT ON THM.PK_Theme = PDT.ThemeId 
    LEFT JOIN StoryProductTheme SPT ON PDT.PK_ProductTheme = SPT.ProductThemeId 
    LEFT JOIN Story STY ON SPT.StoryId = STY.PK_Story 
    WHERE STY.Number = @StoryNumber 
     AND THM.NAME = 'New Development' 
     AND (
      THM.NAME = 'Adaptive' 
      OR THM.NAME = 'Corrective' 
      OR THM.NAME = 'Perfective' 
      OR THM.NAME = 'Preventative' 
      ) 

IF (@return IS NULL) 
    SELECT @return = 'New Development' 

RETURN @return 
END 

Эти IF satements:

IF (
     @return != 'Adaptive' 
     OR @return != 'Corrective' 
     OR @return != 'Perfective' 
     OR @return != 'Preventative' 
     ) 
    SELECT @return = 'New Development' 

должны быть в пределах других. Как я могу убедиться, что они работают правильно?

+4

Используйте 'begin' и' end'. –

+3

Я не могу поверить, что все эти ifs могут быть необходимы. Но с самого начала логика кажется пустым. Как на самом деле '@ count' когда-либо будет 0 или 1? –

+0

Упс, я пропустил кусок Я добавлю его –

ответ

1

SQL Server выполняет один оператор, следующий за IF, если BEGIN и END не используются. Предлагается всегда использовать BEGIN и END (я думаю, что в инструментах MCTS указано это).

Синтаксис:

IF @@TRANCOUNT = 1 
BEGIN 
    -- Do Some Things 
    print 'Do some things' 

    IF @@TRANCOUNT = 1 
    BEGIN 
     -- Do Some Things 
     print 'Do some more things' 
    END 
END 

И here is the BOL link для documenetation.

1

Использование подробного стиля BEGIN IF/END IF поможет (как уже говорил комментатор). Кроме того, вы пытались запустить его в отладчике Studio Studio? В противном случае вы можете посыпать заявления PRINT через sproc, чтобы узнать, как далеко он доходит.

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