2010-08-18 3 views
3

현재 전달되는 동적 키워드 수를 기반으로 결과를 반환하는 SQL 쿼리가 있습니다.SQL 검색 키워드를 사용한 쿼리

키워드 목록을 테이블로 변환하여 조인합니다.

SELECT * FROM Table1 
    INNER JOIN 
     dbo.udf_List2Table(@Keywords, ',') ON (Field1 LIKE '%'+Keyword+'%') 

이 잘 작동하지만 suppiled하는 키워드 어떤를 포함하는 모든 행을 반환합니다. 내가 무엇을하고 싶습니다 모든 키워드의가 포함 된 모든 행을 반환합니다.

나는 JOIN을 사용하여 이것을 할 수 없다고 확신한다. 아무도 내가 이것을 할 수있는 방법에 대한 제안이 있습니까? 동적 SQL을 피하려고합니다.

감사

답변

1
SELECT * 
FROM Table1 
WHERE NOT EXISTS 
     (
     SELECT NULL 
     FROM dbo.udf_List2Table(@Keywords, ',') 
     WHERE field1 NOT LIKE '%' + Keyword + '%' 
     ) 

n 개의 키워드와 일치하는 것을 시도하십시오 분리형 :

SET @Keywords = '"cabbages" AND "kings"' 
SELECT * 
FROM table1 
WHERE CONTAINS(Field1, @Keywords) 
+0

키워드'' '를 (를) 검색하면 SQL 인젝션이 발생하기 쉽습니다. DROP TABLE table1; -' –

+1

@ 존, 저는 이것이 구문을 설명하기 위해 변수와 문자열 리터럴을 사용하는 단순한 예라고 생각합니다. 현실 세계에서 나는 @Keywords가 SQL injection에 취약하지 않은 저장 프로 시저의 매개 변수라고 의심합니다. –

+0

@Jon : 아니요, 바운드 매개 변수로 키워드를 전달하는 한 그렇지 않습니다. – Quassnoi

1

당신이 field1FULLTEXT 인덱스를 작성하고 @Keywords doublequote 동봉하고 AND 경우

SELECT Field1 FROM Table1 
INNER JOIN 
    dbo.udf_List2Table(@Keywords, ',') ON (Field1 LIKE '%'+Keyword+'%') 
GROUP BY Field1 
HAVING COUNT(Keyword) = n 

이보다 효율적으로 수행 할 수 있습니다

0

다음과 같이 조정할 수 있습니다.

DECLARE @recordcount int 
SELECT @recordcount = count(1) from dbo.udf_List2Table(@Keywords, ',') 
select t1.Field1 
from Table1 t1 
where @recordcount = (select count(1) from dbo.udf_List2Table(@Keywords, ',') k where t1.Field1 like '%' + k.Keyword + '%')