2010-08-03 2 views
3

영구 테이블의 여러 열을 테이블 변수의 한 열로 연결하여 contains ("foo"및 "bar")를 실행할 수 있고 foo가 bar와 같은 열에 있지 않아도 결과를 얻을 수 있습니다.은 테이블 변수 또는 임시 테이블을 통한 검색을 포함합니다.

그러나 테이블 변수에 고유 인덱스를 만들 수 없으므로 contains를 실행하는 전체 텍스트 인덱스가 없습니다.

동적으로 여러 열을 연결하고 포함을 실행하는 방법이 있습니까? 그것은이 같은

declare @t0 table 
(
    id uniqueidentifier not null, 
    search_text varchar(max) 
) 

declare @t1 table (id uniqueidentifier) 

insert into 
    @t0 (id, search_text) 
select 
    id, 
    foo + bar 
from 
    description_table 

insert into 
    @t1 
select 
    id 
from 
    @t0 
where 
    contains(search_text, '"c++*" AND "programming*"') 
+0

어떤 SQL Server 버전입니까? –

+0

sql server 2008 sp1 – noobsaibot

답변

2

전체 텍스트 인덱싱을 사용하도록 구성되지 않은 테이블에서 CONTAINS을 사용할 수없고 테이블 변수에 적용 할 수 없습니다.

덜 유연한 PATINDEX와 달리 CONTAINS를 사용하려면 FT 색인이있는 테이블에서 전체 쿼리를 기반으로해야합니다.

+0

글쎄, 나는 검색 패턴을 변경하고 싶지 않을 것이다. 나는 patindex가 contains와 같은 패턴을 이해하지 못한다고 생각한다. contains 대신에 무엇을 사용하고 테이블 vars 또는 임시 테이블을 사용할 수 있습니까? – noobsaibot

+0

"검색 엔진"유형 구문은 전체 텍스트 서비스에서만 사용할 수 있습니다. description_table에 전체 텍스트를 넣고 CONTAINSTABLE() –

+0

을 사용하면 왜 "foo"와 "bar" '가 description_table의 다른 열에 있으므로 찾을 수 없기 때문입니다. – noobsaibot

0
declare @table table 
(
    id int, 
    fname varchar(50) 
) 

insert into @table select 1, 'Adam James Will' 
insert into @table select 1, 'Jain William' 
insert into @table select 1, 'Bob Rob James' 

select * from @table where fname like '%ja%' and fname like '%wi%' 

가 : 여기에 예입니다.

+0

LIKE는 AND 또는 OR 중 가장 간단한 경우에 AND 또는 OR – noobsaibot

+0

hehe를 지원하지 않습니다.) ... 거대한 PITA – noobsaibot

1

테이블 변수에 전체 텍스트 인덱싱을 사용할 수는 없지만 전체 텍스트 파서를 적용 할 수는 있습니다. 이런 일이 당신이 필요로하는 것을 할 것입니까?

declare @d table 
(
id int identity(1,1), 
testing varchar(1000) 
) 

INSERT INTO @D VALUES ('c++ programming') 
INSERT INTO @D VALUES ('c# programming') 
INSERT INTO @D VALUES ('c++ books') 


SELECT id 
FROM @D 
CROSS APPLY sys.dm_fts_parser('"' + REPLACE(testing,'"','""') + '"', 1033, 0,0) 
where display_term in ('c++','programming') 
GROUP BY id 
HAVING COUNT(DISTINCT display_term)=2 

NB : 파서를 사용하는 좋은 방법이 있을지 모르지만 그 사실을 제대로 파악하지 못했습니다. 세부 정보는 at this link

+0

아이디어가 없으므로 dm_fts_parser 파트가하는 일을 실제로 알지 못합니다. 그러나, 나를 위해 유용 할 수 있도록 AND 및 OR을 받아 들여야합니다. – noobsaibot