CONTAINSTABLE (Transact-SQL)
Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen Örneği
Bu sütunlar için kesin veya belirsiz (daha az kesin) eşleşmeler içeren sıfır, bir veya daha fazla satırdan oluşan bir tablo, tek sözcük ve tümceciklerle, sözcüklerin belirli bir mesafedeki yakınlığıyla veya ağırlıklı eşleşmelerle döndürür. CONTAINSTABLE, bir Transact-SQL SELECT deyiminin FROM yan tümcesinde kullanılır ve normal bir tablo adıymış gibi başvurulur. Karakter tabanlı veri türleri içeren tam metin dizinli sütunlarda SQL Server tam metin araması gerçekleştirir.
CONTAINSTABLE, CONTAINS koşulu ile aynı tür eşleşmeler için kullanışlıdır ve CONTAINS ile aynı arama koşullarını kullanır.
Ancak CONTAINSTABLE kullanan sorgular CONTAINSTABLE'ın aksine, her satır için bir ilgi derecelendirme değeri (RANK) ve tam metin anahtarı (KEY) döndürür. SQL Server tarafından desteklenen tam metin arama biçimleri hakkında bilgi için bkz. Full-Text Aramaile sorgu
Transact-SQL söz dizimi kuralları
Sözdizimi
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 ]
)
Bağımsız değişken
tablo
Tam metin dizini oluşturulmuş bir tablonun adıdır.
tablo bir, iki, üç veya dört bölümden oluşabilir. Bir görünümü sorgularken, yalnızca bir tam metin dizinli temel tablo dahil edilebilir.
tablo bir sunucu adı belirtemez ve bağlı sunuculara yönelik sorgularda kullanılamaz.
column_name
Tam metin araması için dizine alınan bir veya daha fazla sütunun adıdır. Sütunlar char, varchar, nchar, nvarchar, metintüründe olabilir . ntext, resim, xml, varbinaryveya varbinary(max).
column_list
Virgülle ayrılmış birkaç sütunun belirtilebileceğini gösterir.
column_list parantez içine alınmalıdır.
language_term belirtilmediği sürece, column_list tüm sütunlarının dili aynı olmalıdır.
*
tablodaki tüm tam metin dizinli sütunların verilen arama koşulu için kullanılması gerektiğini belirtir.
language_term belirtilmediği sürece, tablonun tüm sütunlarının dili aynı olmalıdır.
LANGUAGE language_term
Kaynakları, sorgunun bir parçası olarak sözcük kesme, sözcük kökü oluşturma ve eş anlamlılar sözlüğü ile kirli sözcük (veya stopword) kaldırma için kullanılacak olan dildir. Bu parametre isteğe bağlıdır ve bir dilin yerel ayar tanımlayıcısına (LCID) karşılık gelen bir dize, tamsayı veya onaltılık değer olarak belirtilebilir.
language_term belirtilirse, temsil ettiği dil arama koşulunun tüm öğelerine uygulanır. Değer belirtilmezse, sütun tam metin dili kullanılır.
Farklı dillerdeki belgeler tek bir sütunda ikili büyük nesneler (BLOB) olarak birlikte depolanıyorsa, belirli bir belgenin yerel ayar tanımlayıcısı (LCID), içeriğini dizine almak için hangi dilin kullanıldığını belirler. Böyle bir sütunu sorgularken language**language_term
Dize olarak belirtildiğinde language_term, sys.syslanguages uyumluluk görünümündeki diğer ad sütun değerine karşılık gelir. Dize, 'language_term' içinde olduğu gibi tek tırnak içine alınmalıdır. Tamsayı olarak belirtildiğinde, language_term dili tanımlayan gerçek LCID'dir. Onaltılık değer olarak belirtildiğinde, language_term 0x olur ve bunu LCID'nin onaltılık değeri izler. Onaltılık değer, baştaki sıfırlar da dahil olmak üzere sekiz basamağı aşmamalıdır.
Değer çift baytlık karakter kümesi (DBCS) biçimindeyse, Microsoft SQL Server bunu Unicode'a dönüştürür.
Belirtilen dil geçerli değilse veya bu dile karşılık gelen hiçbir kaynak yüklü değilse, SQL Server bir hata döndürür. Nötr dil kaynaklarını kullanmak için 0x0 language_termolarak belirtin.
top_n_by_rank
Yalnızca n en yüksek dereceli eşleşmelerin azalan sırada döndürüldüğünü belirtir. Yalnızca nbir tamsayı değeri belirtildiğinde geçerlidir.
top_n_by_rank diğer parametrelerle birleştirilirse, sorgu tüm koşullarla eşleşen satır sayısından daha az satır döndürebilir.
top_n_by_rank yalnızca en ilgili isabetleri geri çekerek sorgu performansını artırmanıza olanak tanır.
<contains_search_condition>
column_name içinde aranacak metni ve eşleşme koşullarını belirtir. Arama koşulları hakkında bilgi için bkz. CONTAINS (Transact-SQL).
Açıklamalar
Tam metin önkoşulları ve işlevleri, FROM koşulunda yer alan tek bir tabloda çalışır. Birden çok tabloda arama yapmak için FROM yan tümcenizde birleştirilmiş bir tablo kullanarak iki veya daha fazla tablonun ürünü olan bir sonuç kümesinde arama yapın.
Döndürülen tabloda tam metin anahtar değerleri içeren KEY adlı bir sütun bulunur. Tam metin dizinli her tabloda değerlerin benzersiz olması garanti edilen bir sütun vardır ve KEY sütununda döndürülen değerler, arama koşulunda belirtilen seçim ölçütleriyle eşleşen satırların tam metin anahtar değerleridir. OBJECTPROPERTYEX işlevinden alınan TableFulltextKeyColumn özelliği, bu benzersiz anahtar sütununun kimliğini sağlar. Tam metin dizininin tam metin anahtarıyla ilişkili sütunun kimliğini almak için sys.fulltext_indexeskullanın. Daha fazla bilgi için bkz. sys.fulltext_indexes (Transact-SQL).
İstediğiniz satırları özgün tablodan almak için CONTAINSTABLE satırlarıyla bir birleşim belirtin. CONTAINSTABLE kullanan bir SELECT deyimi için FROM yan tümcesinin tipik biçimi:
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 tarafından üretilen tablo, RANKadlı bir sütun içerir. RANK sütunu, bir satırın seçim ölçütlerine ne kadar uygun olduğunu gösteren her satır için bir değerdir (0 ile 1000 arasında). Bu derece değeri genellikle SELECT deyiminde şu yollardan birinde kullanılır:
ORDER BY yan tümcesinde, en yüksek derecelendirmeli satırları tablonun ilk satırları olarak döndürür.
Her satıra atanan derecelendirme değerini görmek için seçme listesinde.
İzinler
Yürütme izinleri yalnızca tabloda veya başvuruda bulunulmuş tablonun sütunlarında uygun SELECT ayrıcalıklarına sahip kullanıcılar tarafından kullanılabilir.
Örnekler
A. Basit Örnek
Aşağıdaki örnek, 3 ilçeyi ve bayraklarındaki renkleri listeleyerek iki sütundan oluşan basit bir tablo oluşturur ve doldurur. Tablodaki tam metin kataloğunu ve dizinini oluşturur ve doldurur. Ardından CONTAINSTABLE söz dizimi
CREATE TABLE Flags (Country nvarchar(30) NOT NULL, FlagColors varchar(200));
CREATE UNIQUE CLUSTERED INDEX FlagKey ON Flags(Country);
INSERT Flags VALUES ('France', 'Blue and White and Red');
INSERT Flags VALUES ('Italy', 'Green and White and Red');
INSERT 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. Derece değerlerini döndürme
Aşağıdaki örnek, "çerçeve", "tekerlek" veya "lastik" sözcüklerini içeren tüm ürün adlarını arar ve her sözcüğe farklı ağırlıklar verilir. Bu arama ölçütlerine uyan döndürülen her satır için, eşleşmenin göreli yakınlığı (derecelendirme değeri) gösterilir. Buna ek olarak, en yüksek derecelendirme satırları önce döndürülür.
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. Belirtilen değerden büyük derece değerleri döndürme
için geçerlidir: SQL Server 2012 (11.x) ve üzeri. |
Aşağıdaki örnek, Production.Document
tablosunda birbirine yakın "bracket
" ve "reflector
" aramak için NEAR kullanır. Yalnızca derece değeri 50 veya daha yüksek olan satırlar döndürülür.
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
Not
Tam metin sorgusu maksimum uzaklık olarak bir tamsayı belirtmezse, yalnızca boşluğu 100 mantıksal terimden büyük olan isabetleri içeren bir belge NEAR gereksinimlerini karşılamaz ve derecelendirmesi 0 olur.
D. top_n_by_rank kullanarak ilk 5 dereceli sonucu döndürme
Aşağıdaki örnek, Description
sütununun "hafif" veya "hafif" sözcüğünün yanında "alüminyum" sözcüğünü içerdiği ilk 5 ürünün açıklamasını döndürür.
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
GO
E. LANGUAGE bağımsız değişkenini belirtme
Aşağıdaki örnekte LANGUAGE
bağımsız değişkeninin kullanılması gösterilmektedir.
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
Not
top_n_by_rank kullanmak için LANGUAGE language_term bağımsız değişkeni gerekli değildir.
Ayrıca Bkz.
RANK ile Arama Sonuçlarını Sınırlama
Full-Text Arama
Full-Text Arama Sorguları Oluşturma (Visual Database Araçları)
CONTAINS (Transact-SQL)
Full-Text Arama
SELECT (Transact-SQL)
FROM (Transact-SQL)