Помогите! - SQL - IF иначе IF логика для возврата Containstable selection - PullRequest
2 голосов
/ 25 февраля 2009

Я пытаюсь использовать IF else If, ​​если логика находится внутри встроенной табличной функции для SQL, и возвращает возвращаемую таблицу на основе этой логики. но у меня есть проблемы с синтаксисом блока IF Else IF. Спасибо за помощь. Так как я не могу параметризовать столбцы вчиваемой таблицы, я должен прибегнуть к использованию операторов if else. вот код спасибо.

я получаю

Сообщение 156, уровень 15, состояние 1, процедура FullTextSearch, строка 17 Неверный синтаксис рядом с ключевым словом «IF».

ALTER FUNCTION [dbo].[FullTextSearch] 
(       
    @Columns nvarchar(100), @SearchPhrase nvarchar(100)
)

RETURNS TABLE 
AS    
RETURN 


IF (@Columns='Title')
   BEGIN
   SELECT * 
        from projects as P inner join
        containstable(PROJECTS, Title, @SearchPhrase) as K 
        on P.project_id = K.[KEY]
   END

ELSE IF (@Columns='Project_Details')
   BEGIN
   SELECT * 
    from projects as P inner join
    containstable(PROJECTS, Project_Details, @SearchPhrase) as K 
    on P.project_id = K.[KEY]
   END

ELSE IF (@Columns='Contact_Info')
   BEGIN
   SELECT * 
    from projects as P inner join
    containstable(PROJECTS, Contact_Info, @SearchPhrase) as K 
    on P.project_id = K.[KEY]
   END

ELSE IF (@Columns='Project_Description')
   BEGIN
   SELECT * 
        from projects as P inner join
        containstable(PROJECTS, Project_Description, @SearchPhrase) as K 
        on P.project_id = K.[KEY]
   END

ELSE -- (@Columns='All')
   BEGIN
   SELECT * 
        from projects as P inner join
        containstable(PROJECTS, (Title, Project_Details, Contact_Info,     Project_Description), @SearchPhrase) as K 
        on P.project_id = K.[KEY]
   END

Ответы [ 3 ]

2 голосов
/ 25 февраля 2009

Вы получаете эту ошибку, потому что вы пытаетесь использовать несколько операторов во встроенной табличной функции.

Встроенная табличная функция должна содержать один оператор SELECT, что-то вроде:

CREATE FUNCTION dbo.MyInlineFunction (@MyParam INT)
RETURNS TABLE
AS
RETURN 
(
    SELECT first_column, second_column FROM ...
)

Ваша функция должна быть объявлена ​​как функция с несколькими операторами, синтаксис подобен этому:

CREATE FUNCTION dbo.MyMultiStatementFunction (@MyParam INT)
RETURNS @MyTable TABLE 
(
    first_column INT, second_column VARCHAR(100)  -- etc
)
AS
BEGIN
    IF (@MyParam = 1)
        INSERT INTO @MyTable (...)
        SELECT ... FROM ...
    ELSE
        INSERT INTO @MyTable (...)
        SELECT ... FROM ...

    RETURN
END
0 голосов
/ 25 февраля 2009

Посмотрите на шаблон функции с несколькими утверждениями в студии управления sql, т. Е. В меню: View-> Template Explorer - Создайте табличную функцию с несколькими операторами.

Проблема в том, что синтаксис отличается для функции с несколькими операторами. Также обратите внимание, что, как сказал jmein, в первом случае стоит ==, если

0 голосов
/ 25 февраля 2009

Прежде всего, у вас есть == на первом IF, а не =

О да, и я заметил, что в параметрах CONTAINSTABLE в вашем ELSE у вас есть ProjectDetails, перечисленные дважды

Если вы ищете определенное поле, вы можете просто использовать этот синтаксис:

WHERE Title LIKE '%'+ @Search +'%'
      OR ProjectDetails LIKE '%' + @Search + '%'
      OR ContactInfo LIKE '%' + @Search + '%')

(Предупреждение). Этот синтаксис игнорирует любую индексацию.

Вы можете проверить этот блог для решения, которое работает с индексацией. Кажется, есть хорошее решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...