2011-09-28 3 views
1

이 작은 샘플 표 Person을 만들었습니다. 나는 전체 텍스트 카탈로그를 만들려고 할 때 전체 텍스트 카탈로그가 기본 키를 검색 할 수 없습니다.

진정한 ID가 기본 키이며 정체성이다

enter image description here

은 = 지금, 나는 ID를 검색 할 수 없습니다입니다. 나는이 마법사를 따르는 경우

enter image description here

, 나는 가능한 유일한이 사람의 이름을 검색 할 수있는 카탈로그, 될 겁니다. 나는 정말로 ID와 이름에 대한 전문 검색을 할 수있는 방법을 알고 싶다.

편집하는

enter image description here

SELECT * 
FROM [TestDB].[dbo].[Person] 
WHERE FREETEXT (*, 'anders'); 

SELECT * 
FROM [TestDB].[dbo].[Person] 
WHERE FREETEXT (*, '1'); 

나도 같은 결과를 반환하도록하고 싶은 첫 번째 반환 ID = 1 개 이름 = 앤더스는 두 번째 쿼리는 아무것도 반환하지 않습니다 동안. 문제가 INT을 사용하여처럼

편집이

은 보이지만, 풀 텍스트가 그것을 지원하기 위해 트릭을하지 수 있습니까?

편집 3

나는 NVARCHAR로 INT로 변환하는 뷰를 만들었습니다. CONVERT(nvarchar(50), Id) AS PersonId 이렇게하면 전체 텍스트 카탈로그를 만들 때 해당 열을 선택할 수있게되었지만 여전히 ID를 검색 할 수는 없습니다.

답변

2

귀하의 질문을 읽으면서 전체 텍스트 색인의 목적을 이해하고 있는지 확신 할 수 없습니다. 전체 텍스트 색인은 표에서 TEXT (하나 이상의 열)를 검색합니다. 그리고 단지를 대체 :

SELECT * 
FROM table 
WHERE col1 LIKE 'Bob''s Pizzaria%' 
OR col2 LIKE 'Bob''s Pizzaria%' 
OR col3 LIKE 'Bob''s Pizzaria%' 

또한 경우 누군가가 피자를 잘못 철자 나에 넣어 깜빡 당신이 ("가볍게 침 Pizz 전자 RIA"와 같은 "밥의 Pizzaria"의 변화를 검색 할 수 있습니다 ' "또는"Robert 's Pizza "또는"Bob 's Pizzeria "또는"Bob 's Pizza "등을 제거한 것입니다. 또한 텍스트 열의"중간 "을 검색 할 수 있습니다 (char, varchar, nchar, nvarchar 등)에서 기존 인덱스를 사용할 기회를 없애는 "% Bob % Pizza %"를 사용하지 않아도됩니다.

그러나 강의는 충분합니다. 당신이 모르는 경우

UPDATE t 
SET IdText = CAST(Id AS varchar(10)) 
FROM table AS t 
INNER JOIN inserted i ON i.Id = t.Id 

: 특정 질문에 대답하기 위해, 나는 그 때 별도의 열 (안 "계산 열") "IdText의 VARCHAR (10)"이 같은 INSERT AFTER 트리거 뭔가를 만들 것 "무엇이 삽입 됐는지"는 MSDN article을 보거나 "트리거가 삽입되었습니다"에 대해 스택 오버플로를 검색하십시오. 그런 다음 전체 텍스트 인덱스에 IdText 열을 포함 할 수 있습니다.

다시 예제에서 전체 텍스트 인덱스는 여기에서 사용해야하지만 실제로 다시는 실제 상황이 달라질 수 있으며 방금 질문에 대한 예제를 만들었습니다. 또한 전체 텍스트 인덱스는 비교적 "비쌉니다"이므로 비용 편익 분석을 수행하십시오. 전체 텍스트 색인 사용에 대한 질문은 Stack Overflow입니다.

1

왜 이와 같은 쿼리를 작성하지 않는 것이 좋을까요?

SELECT * 
FROM [TestDB].[dbo].[Person] 
WHERE FREETEXT (*, '1') 
OR ID = 1 

검색어가 숫자인지 먼저 확인하면 "OR ID = 1"부분을 벗어날 수 있습니다.