2

我正在尝试在 SQL 的内联表值函数中使用 IF else If 逻辑,并根据该逻辑返回一个包含表。但我遇到了 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
4

3 回答 3

2

您收到此错误是因为您尝试在内联表值函数中使用多个语句。

内联表值函数必须包含单个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
于 2009-02-25T20:21:56.443 回答
0

首先,您在第一个 IF 上有 == 而不是 =

哦,是的,我注意到在 ELSE 的 CONTAINSTABLE 参数中,您列出了两次 ProjectDetails

如果您正在搜索特定字段,您可以使用以下语法:

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

(警告)此语法忽略任何索引。

您可以查看此博客以获取适用于索引的解决方案。它似乎有一个很好的解决方案。

于 2009-02-25T19:00:50.663 回答
0

查看sql management studio的多语句函数模板ie on menu:View->Template Explorer-Create Multi-Statement Table-valued Function。

问题是多语句函数的语法不同。另请注意,正如 jmein 所说,第一个 if 有一个 ==。

于 2009-02-25T19:05:47.017 回答