적용 대상:SQL Server
Azure SQL 데이터베이스
Azure SQL Managed Instance
정확하거나 유사하거나(덜 정확하지 않은) 단일 단어와 구, 특정 거리 내의 단어 근접성 또는 가중치 일치 항목이 포함된 열에 대해 0개, 하나 이상의 행 테이블을 반환합니다.
CONTAINSTABLE는 Transact-SQL 문의 SELECT에 사용되며 일반 테이블 이름인 것처럼 참조됩니다. 문자 기반 데이터 형식을 포함하는 전체 텍스트 인덱싱된 열에서 SQL Server 전체 텍스트 검색을 수행합니다.
CONTAINSTABLE는 CONTAINS와 동일한 종류의 일치 항목에 유용하며 .CONTAINS
그러나 쿼리를 사용하는 CONTAINS 경우와 달리 CONTAINSTABLE각 행에 대한 관련성 순위 값(RANK) 및 전체 텍스트 키(KEY)를 반환합니다. SQL Server에서 지원되는 전체 텍스트 검색 형식에 대한 자세한 내용은 전체 텍스트 검색이 있는 쿼리를 참조하세요.
구문
CONTAINSTABLE
( table , { column_name | ( column_list ) | * } , ' <contains_search_condition> '
[ , LANGUAGE language_term ]
[ , top_n_by_rank ]
)
<contains_search_condition> ::=
{ <simple_term>
| <prefix_term>
| <generation_term>
| <generic_proximity_term>
| <custom_proximity_term>
| <weighted_term>
}
| { ( <contains_search_condition> )
{ { AND | & } | { AND NOT | &! } | { OR | | } }
<contains_search_condition> [ ...n ]
}
<simple_term> ::=
{ word | "phrase" }
<prefix term> ::=
{ "word*" | "phrase*" }
<generation_term> ::=
FORMSOF ( { INFLECTIONAL | THESAURUS } , <simple_term> [ , ...n ] )
<generic_proximity_term> ::=
{ <simple_term> | <prefix_term> } { { { NEAR | ~ }
{ <simple_term> | <prefix_term> } } [ ...n ] }
<custom_proximity_term> ::=
NEAR (
{
{ <simple_term> | <prefix_term> } [ , ...n ]
|
( { <simple_term> | <prefix_term> } [ , ...n ] )
[ , <maximum_distance> [ , <match_order> ] ]
}
)
<maximum_distance> ::= { integer | MAX }
<match_order> ::= { TRUE | FALSE }
<weighted_term> ::=
ISABOUT
( { {
<simple_term>
| <prefix_term>
| <generation_term>
| <proximity_term>
}
[ WEIGHT ( weight_value ) ]
} [ , ...n ]
)
인수
테이블
전체 텍스트 인덱싱된 테이블의 이름입니다. 테이블 은 1, 2, 3 또는 4부 데이터베이스 개체 이름이 될 수 있습니다. 뷰를 쿼리할 때는 하나의 전체 텍스트 인덱싱된 기본 테이블만 포함할 수 있습니다.
테이블 은 서버 이름을 지정할 수 없으며 연결된 서버에 대한 쿼리에서 사용할 수 없습니다.
column_name
전체 텍스트 검색을 위해 인덱싱된 하나 이상의 열 이름입니다. 열은 char, varchar, nchar, nvarchar, text, ntext, image, xml, varbinary 또는 varbinary(max) 형식이 될 수 있습니다.
column_list
여러 개의 열을 쉼표로 구분하여 지정할 수 있음을 나타냅니다. column_list는 괄호로 묶어야 합니다. language_term을 지정하지 않을 경우 column_list에 있는 모든 열의 언어가 같아야 합니다.
*
테이블의 모든 전체 텍스트 인덱싱된 열을 사용하여 지정된 검색 조건을 검색하도록 지정합니다. language_term을 지정하지 않을 경우 테이블에 있는 모든 열의 언어가 같아야 합니다.
언어 language_term
쿼리의 일부로 단어 분리, 형태소 분석 및 동의어 사전 및 노이즈 단어(또는 중지 단어) 제거에 리소스가 사용되는 언어입니다. 이 매개 변수는 선택적이며 언어의 LCID(로캘 ID)에 해당하는 문자열, 정수 또는 16진수 값으로 지정할 수 있습니다. language_term 지정하면 해당 언어가 나타내는 언어가 검색 조건의 모든 요소에 적용됩니다. 값을 지정하지 않으면 열의 전체 텍스트 언어가 사용됩니다.
언어가 다른 문서가 단일 열에 BLOB(Binary Large Object)으로 함께 저장된 경우 지정된 문서의 LCID(로캘 ID)에 따라 해당 내용을 인덱싱하는 데 사용할 언어가 결정됩니다. 이러한 열을 쿼리할 때 일치하는 확률을 높이도록 지정 LANGUAGE <language_term> 합니다.
문자열로 지정하면 language_termalias 호환성 보기의 열 값에 해당 합니다. 문자열은 'language_term'과 같이 작은따옴표로 묶어야 합니다. 정수로 지정하는 경우 language_term은 언어를 식별하는 실제 LCID입니다. 16진수 값으로 지정하는 경우 language_term은 0x로 시작하는 16진수 LCID 값입니다. 16진수 값은 앞에 오는 0을 포함하여 8자리 수를 초과할 수 없습니다.
값이 DBCS(더블 바이트 문자 집합) 형식인 경우 SQL Server는 이를 유니코드로 변환합니다.
지정된 언어가 유효하지 않거나 해당 언어에 해당하는 리소스가 설치되지 않은 경우 SQL Server에서 오류를 반환합니다. 중립 언어 리소스를 사용하려면 0x0을 language_term으로 지정합니다.
top_n_by_rank
내림차순으로 가장 높은 순위 일치 항목만 반환되도록 지정합니다. 정수 값 n을 지정한 경우에만 적용됩니다. top_n_by_rank 다른 매개 변수와 결합된 경우 쿼리는 실제로 모든 조건자와 일치하는 행 수보다 적은 행을 반환할 수 있습니다. top_n_by_rank 사용하면 가장 관련성이 큰 적중 항목만 회수하여 쿼리 성능을 높일 수 있습니다.
<contains_search_condition>
column_name에서 검색할 텍스트와 일치 조건을 지정합니다. 검색 조건에 대한 자세한 내용은 CONTAINS를 참조하세요.
설명
전체 텍스트 조건자와 함수는 조건자에서 FROM 암시된 단일 테이블에서 작동합니다. 여러 테이블을 검색하려면 절에 FROM 조인된 테이블을 사용하여 둘 이상의 테이블의 곱인 결과 집합을 검색합니다.
반환되는 테이블에는 전체 텍스트 키 값이 포함된 열이 있습니다 KEY . 인덱싱된 각 테이블에는 값이 고유하도록 보장되는 열이 있으며, 열에 KEY 반환되는 값은 포함 검색 조건에 지정된 선택 조건과 일치하는 행의 전체 텍스트 키 값입니다. 함수에서 TableFulltextKeyColumn 가져온 속성은 OBJECTPROPERTYEX 이 고유 키 열의 ID를 제공합니다. 전체 텍스트 인덱 sys.fulltext_indexes 스의 전체 텍스트 키와 연결된 열의 ID를 가져오려면 자세한 내용은 sys.fulltext_indexes 참조하세요.
원래 테이블에서 원하는 행을 가져오려면 행과 조인을 CONTAINSTABLE 지정합니다. 사용하는 FROM 문에 대한 SELECT 절의 CONTAINSTABLE 일반적인 형식은 다음과 같습니다.
SELECT select_list
FROM table AS FT_TBL
INNER JOIN CONTAINSTABLE(table, column, contains_search_condition) AS KEY_TBL
ON FT_TBL.unique_key_column = KEY_TBL.[KEY];
생성된 CONTAINSTABLE 테이블에는 이름이 인 RANK열이 포함됩니다. 열은 RANK 행이 선택 조건과 얼마나 잘 일치하는지를 나타내는 각 행의 값(0에서 1000까지)입니다. 이 순위 값은 일반적으로 문에서 다음 방법 SELECT 중 하나로 사용됩니다.
테이블의
ORDER BY첫 번째 행으로 가장 높은 순위 행을 반환하는 절에서선택 목록에서 각 행에 할당된 순위 값을 확인합니다.
사용 권한
실행 권한은 테이블 또는 참조된 테이블의 열에 대한 적절한 SELECT 권한이 있는 사용자만 사용할 수 있습니다.
예제
A. 기본 예제
다음 예제에서는 세 개의 국가/지역과 해당 플래그의 색을 나열하는 두 개의 열로 구성된 간단한 테이블을 만들고 채웁니다. 테이블의 전체 텍스트 카탈로그와 인덱스를 만들고 채웁니다.
CONTAINSTABLE 그런 다음 구문이 설명됩니다. 이 예제에서는 검색 값이 여러 번 충족되면 순위 값이 증가하는 방법을 보여 줍니다. 마지막 쿼리에서 녹색과 검은색을 모두 포함하는 탄자니아는 쿼리된 색 중 하나만 포함하는 이탈리아보다 순위가 높습니다.
CREATE TABLE Flags
(
CountryOrRegion NVARCHAR (30) NOT NULL,
FlagColors VARCHAR (200)
);
CREATE UNIQUE CLUSTERED INDEX FlagKey ON Flags(CountryOrRegion);
INSERT INTO Flags VALUES ('France', 'Blue and White and Red');
INSERT INTO Flags VALUES ('Italy', 'Green and White and Red');
INSERT INTO Flags VALUES ('Tanzania', 'Green and Yellow and Black and Yellow and Blue');
SELECT * FROM Flags;
GO
CREATE FULLTEXT CATALOG TestFTCat;
CREATE FULLTEXT INDEX ON Flags (FlagColors) KEY INDEX FlagKey
ON TestFTCat;
GO
SELECT * FROM Flags;
SELECT *
FROM CONTAINSTABLE (Flags, FlagColors, 'Green')
ORDER BY RANK DESC;
SELECT *
FROM CONTAINSTABLE (Flags, FlagColors, 'Green or Black')
ORDER BY RANK DESC;
B. 순위 값 반환
다음 예제에서는 단어 또는 framewheel단어가 tire포함된 모든 제품 이름을 검색하고 각 단어에 서로 다른 가중치를 지정합니다. 이러한 검색 조건과 일치하는 반환된 각 행에 대해 일치 항목의 상대적 근접성(순위 값)이 표시됩니다. 또한 가장 높은 순위 행이 먼저 반환됩니다.
USE AdventureWorks2022;
GO
SELECT FT_TBL.Name,
KEY_TBL.RANK
FROM Production.Product AS FT_TBL
INNER JOIN CONTAINSTABLE (
Production.Product,
Name,
'ISABOUT (frame WEIGHT (.8), wheel WEIGHT (.4), tire WEIGHT (.2) )'
) AS KEY_TBL
ON FT_TBL.ProductID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC;
GO
C. 지정된 값보다 큰 순위 값을 반환합니다.
적용 대상: SQL Server 2012(11.x) 이상 버전
다음 예제에서는 NEAR를 사용하여 테이블에서 서로를 bracket 검색 reflector 하고 Production.Document 가까이 찾습니다. 순위 값이 50 이상인 행만 반환됩니다.
USE AdventureWorks2022;
GO
SELECT DocumentNode,
Title,
DocumentSummary
FROM Production.Document AS DocTable
INNER JOIN CONTAINSTABLE (Production.Document, Document, 'NEAR(bracket, reflector)') AS KEY_TBL
ON DocTable.DocumentNode = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 50
ORDER BY KEY_TBL.RANK DESC;
GO
참고 항목
전체 텍스트 쿼리에서 정수를 최대 거리로 지정하지 않으면 간격이 100개보다 큰 적중 항목만 포함된 문서는 요구 사항을 충족 NEAR 하지 않으며 순위는 0입니다.
D. top_n_by_rank 사용하여 상위 5개 순위 결과 반환
다음 예제에서는 열에 단어 Description 또는 단어 aluminum근처의 단어가 light 포함된 상위 5개 제품에 lightweight 대한 설명을 반환합니다.
USE AdventureWorks2022;
GO
SELECT FT_TBL.ProductDescriptionID,
FT_TBL.Description,
KEY_TBL.RANK
FROM Production.ProductDescription AS FT_TBL
INNER JOIN CONTAINSTABLE (Production.ProductDescription, Description,
'(light NEAR aluminum) OR (lightweight NEAR aluminum)', 5) AS KEY_TBL
ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY];
GO
E. LANGUAGE 인수 지정
다음 예제에서는 인수를 사용하는 방법을 LANGUAGE 보여줍니다.
USE AdventureWorks2022;
GO
SELECT FT_TBL.ProductDescriptionID,
FT_TBL.Description,
KEY_TBL.RANK
FROM Production.ProductDescription AS FT_TBL
INNER JOIN CONTAINSTABLE (Production.ProductDescription, Description,
'(light NEAR aluminum) OR (lightweight NEAR aluminum)',
LANGUAGE N'English', 5) AS KEY_TBL
ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY];
GO
참고 항목
LANGUAGE language_term 인수는 top_n_by_rank 사용하는 데 필요하지 않습니다 .