2

인라인 테이블 내부의 논리가 SQL의 함수를 평가하고 해당 논리에 기반한 Containstable을 반환하면 IF else를 사용하려고합니다. 하지만 IF 다른 IF 블록 구문 오류가 있습니다. 도와 주셔서 감사합니다. 왜냐하면 나는 elsest 문장을 사용하는 것에 의지해야만하는 Containstable의 컬럼을 매개 변수화할 수 없기 때문이다. 여기에 코드가 있습니다. 감사.Help! 만약 그렇지 않으면 Else IF 논리를 반환합니다. Containsable 선택

내가 키워드 'IF'에 가까운 17 잘못된 구문은

메시지 156, 수준 15, 상태 1, 프로 시저 FullTextSearch, 라인

을 얻고있다. 모든

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 
+0

이 쿼리로 정확히 무엇을 하려는지 궁금합니다. –

+0

나는 C#에서 asp.net의 LinqTOSQL 레이어와 함께 검색 인터페이스를 가지고 있지만 LINQ to SQL은 훌륭하지만 전체 텍스트 검색 기능을 지원하지 않으므로 프로 시저 또는 테이블 값 함수를 사용하는 다른 방법은 없습니다. 나는 래퍼/확장 기능을 사용하는 것에 대해 읽었지만 이것을 결정했다. – stevenjmyu

+0

필드에서 문자열을 검색하려고합니다. 어떤 분야가 될 수 있는지, 아니면 잠재적으로 모든 분야에 적용될 수 있는지 알고 있습니까? –

답변

2

인라인 테이블 반환 함수에서 여러 명령문을 사용하려고하기 때문에이 오류가 발생합니다. 이 비슷한

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

당신의 함수는 다중 문 함수로 선언 될 필요가 구문 :

인라인 테이블 반환 함수의 라인을 따라 뭔가를 하나의 SELECT 설명을 포함해야한다

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

먼저, 대신 =

오, 그래 경우 첫 번째에 ==하고 난 당신 ELSE에서 CONTAINSTABLE 매개 변수 내에서 당신이 ProjectDetails 두 번

을 열거 한 것으로 나타났습니다 당신이 만약 특정 필드를 검색하면 다음 구문을 사용할 수 있습니다.

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

(경고)이 구문은 색인 생성을 무시합니다.

이 항목은 blog에서 색인 생성과 함께 작동하는 솔루션을 확인할 수 있습니다. 좋은 해결책이있는 것 같습니다.

+0

죄송합니다, 테스트 목적으로 거기에 코드를 붙여 넣을 때 다시 변경하는 것을 잊어 버렸습니다.그것은 하나의 "="죄송합니다. SQL은 초보자입니다. – stevenjmyu

+0

LINQtoSQL은 context.contains (필드, "검색 텍스트")를 작성할 수 있고 SQL 측에서 LIKE로 변환하므로 유용합니다. 그 문제는 마치 인덱스가 있으면 SQL에서 전체 텍스트 검색을 최대한 활용하지 못하는 것입니다. Like를 사용하는 것은 나를위한 옵션이 아닙니다. – stevenjmyu

+0

필자는 LIKE를 사용하여 구현했지만 전체 텍스트 검색을 사용할 때보 다 여러 필드에서 수백만 개의 레코드가있는 테이블을 사용하는 데 시간이 오래 걸립니다. – stevenjmyu

0

SQL Management Studio의 다중 명령문 기능 템플리트 (보기 -> 템플리트 탐색기 - 다중 문 테이블 값 기능 작성)을보십시오.

다중 문 기능에 대한 구문이 다릅니다. 또한 jmein이 말했듯이 첫 번째 경우에 ==가 있습니다.

+0

그는 문제를 해결했지만 도움이 안된다고 생각합니다. –

+0

실제 문제는 다중 문 테이블 반환 함수의 구문이 다르기 때문에 – eglasius

+0

감사합니다. 지금 구문에 대한 템플릿을보고 있습니다. – stevenjmyu

관련 문제