CONTAINSTABLE (Transact-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Mengembalikan tabel nol, satu, atau beberapa baris untuk kolom yang berisi kecocokan tepat atau fuzzy (kurang tepat) dengan satu kata dan frasa, kedekatan kata dalam jarak tertentu satu sama lain, atau kecocokan tertimbang. CONTAINSTABLE digunakan dalam klausa FROM dari pernyataan Transact-SQL SELECT dan dirujuk seolah-olah itu adalah nama tabel biasa. Ini melakukan pencarian teks lengkap SQL Server pada kolom terindeks teks lengkap yang berisi jenis data berbasis karakter.

CONTAINSTABLE berguna untuk jenis kecocokan yang sama dengan predikat CONTAINS dan menggunakan kondisi pencarian yang sama dengan CONTAINS.

Namun, tidak seperti CONTAINS, kueri yang menggunakan CONTAINSTABLE mengembalikan nilai peringkat relevansi (RANK) dan kunci teks lengkap (KEY) untuk setiap baris. Untuk informasi tentang formulir pencarian teks lengkap yang didukung oleh SQL Server, lihat Kueri dengan Pencarian Teks Lengkap.

Konvensi sintaks transact-SQL

Sintaks

  
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 ]   
    )  
  

Argumen

tabel
Adalah nama tabel yang telah diindeks teks lengkap. tabel dapat berupa nama objek database satu, dua, tiga, atau empat bagian. Saat mengkueri tampilan, hanya satu tabel dasar terindeks teks lengkap yang dapat terlibat.

tabel tidak dapat menentukan nama server dan tidak dapat digunakan dalam kueri terhadap server tertaut.

column_name
Adalah nama satu atau beberapa kolom yang diindeks untuk pencarian teks lengkap. Kolom dapat berjenis char, varchar, nchar, nvarchar, text, ntext, image, xml, varbinary, atau varbinary(max).

column_list
Menunjukkan bahwa beberapa kolom, yang dipisahkan oleh koma, dapat ditentukan. column_list harus diapit tanda kurung. Kecuali language_term ditentukan, bahasa semua kolom column_list harus sama.

*
Menentukan bahwa semua kolom terindeks teks lengkap dalam tabel harus digunakan untuk mencari kondisi pencarian yang diberikan. Kecuali language_term ditentukan, bahasa semua kolom tabel harus sama.

LANGUAGE_TERM BAHASA
Adalah bahasa yang sumber dayanya akan digunakan untuk pemecahan kata, stemming, dan penghapusan tesaurus dan kata bising (atau stopword) sebagai bagian dari kueri. Parameter ini bersifat opsional dan dapat ditentukan sebagai string, bilangan bulat, atau nilai heksadesimal yang sesuai dengan pengidentifikasi lokal (LCID) bahasa. Jika language_term ditentukan, bahasa yang diwakilinya akan diterapkan ke semua elemen kondisi pencarian. Jika tidak ada nilai yang ditentukan, kolom bahasa teks lengkap digunakan.

Jika dokumen dari bahasa yang berbeda disimpan bersama-sama sebagai objek besar biner (BLOB) dalam satu kolom, pengidentifikasi lokal (LCID) dari dokumen tertentu menentukan bahasa apa yang digunakan untuk mengindeks kontennya. Saat mengkueri kolom seperti itu, menentukan LANGUAGE**language_term dapat meningkatkan probabilitas kecocokan yang baik.

Saat ditentukan sebagai string, language_term sesuai dengan nilai kolom alias dalam tampilan kompatibilitas sys.syslanguages. String harus diapit dalam tanda kutip tunggal, seperti dalam 'language_term'. Ketika ditentukan sebagai bilangan bulat, language_term adalah LCID aktual yang mengidentifikasi bahasa. Ketika ditentukan sebagai nilai heksadesimal, language_term adalah 0x diikuti oleh nilai heksadesimal LCID. Nilai heksadesimal tidak boleh melebihi delapan digit, termasuk nol di depannya.

Jika nilai dalam format kumpulan karakter byte ganda (DBCS), Microsoft SQL Server akan mengonversinya ke Unicode.

Jika bahasa yang ditentukan tidak valid atau tidak ada sumber daya yang diinstal yang sesuai dengan bahasa tersebut, SQL Server mengembalikan kesalahan. Untuk menggunakan sumber daya bahasa netral, tentukan 0x0 sebagai language_term.

top_n_by_rank
Menentukan bahwa hanya n kecocokan berperingkat tertinggi, dalam urutan turun, yang dikembalikan. Hanya berlaku ketika nilai bilangan bulat, n, ditentukan. Jika top_n_by_rank dikombinasikan dengan parameter lain, kueri dapat mengembalikan lebih sedikit baris daripada jumlah baris yang benar-benar cocok dengan semua predikat. top_n_by_rank memungkinkan Anda meningkatkan performa kueri dengan hanya mengingat hit yang paling relevan.

<contains_search_condition>
Menentukan teks yang akan dicari di column_name dan kondisi untuk kecocokan. Untuk informasi tentang kondisi pencarian, lihat CONTAINS (Transact-SQL).

Keterangan

Predikat teks lengkap dan fungsi bekerja pada satu tabel, yang tersirat dalam predikat FROM. Untuk mencari di beberapa tabel, gunakan tabel yang digabungkan dalam klausa FROM Anda untuk mencari pada tataan hasil yang merupakan produk dari dua tabel atau lebih.

Tabel yang dikembalikan memiliki kolom bernama KEY yang berisi nilai kunci teks lengkap. Setiap tabel terindeks teks lengkap memiliki kolom yang nilainya dijamin unik, dan nilai yang dikembalikan dalam kolom KEY adalah nilai kunci teks lengkap dari baris yang cocok dengan kriteria pilihan yang ditentukan dalam berisi kondisi pencarian. Properti TableFulltextKeyColumn , yang diperoleh dari fungsi OBJECTPROPERTYEX, menyediakan identitas kolom kunci unik ini. Untuk mendapatkan ID kolom yang terkait dengan kunci teks lengkap indeks teks lengkap, gunakan sys.fulltext_indexes. Untuk informasi selengkapnya, lihat sys.fulltext_indexes (Transact-SQL).

Untuk mendapatkan baris yang Anda inginkan dari tabel asli, tentukan gabungan dengan baris CONTAINSTABLE. Bentuk umum klausa FROM untuk pernyataan SELECT menggunakan CONTAINSTABLE adalah:

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];  

Tabel yang dihasilkan oleh CONTAINSTABLE menyertakan kolom bernama RANK. Kolom RANK adalah nilai (dari 0 hingga 1000) untuk setiap baris yang menunjukkan seberapa baik baris cocok dengan kriteria pilihan. Nilai peringkat ini biasanya digunakan dalam salah satu cara ini dalam pernyataan SELECT:

  • Dalam klausa ORDER BY untuk mengembalikan baris peringkat tertinggi sebagai baris pertama dalam tabel.

  • Dalam daftar pilih untuk melihat nilai peringkat yang ditetapkan untuk setiap baris.

Izin

Izin eksekusi hanya tersedia oleh pengguna dengan hak istimewa SELECT yang sesuai pada tabel atau kolom tabel yang dirujuk.

Contoh

J. Contoh sederhana

Contoh berikut membuat dan mengisi tabel sederhana dari dua kolom, mencantumkan 3 kabupaten dan warna dalam benderanya. Ini membuat dan mengisi katalog teks lengkap dan indeks pada tabel. Kemudian sintaks CONTAINSTABLE ditunjukkan. Contoh ini menunjukkan bagaimana nilai peringkat tumbuh lebih tinggi ketika nilai pencarian terpenuhi beberapa kali. Dalam kueri terakhir, Tanzania yang berisi hijau dan hitam memiliki peringkat lebih tinggi daripada Italia yang hanya berisi salah satu warna yang dikueri.

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. Mengembalikan nilai peringkat

Contoh berikut mencari semua nama produk yang berisi kata "frame," "wheel," atau "tire," dan bobot yang berbeda diberikan untuk setiap kata. Untuk setiap baris yang dikembalikan yang cocok dengan kriteria pencarian ini, kedekatan relatif (nilai peringkat) dari kecocokan ditampilkan. Selain itu, baris peringkat tertinggi dikembalikan terlebih dahulu.

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. Mengembalikan nilai peringkat yang lebih besar dari nilai yang ditentukan

Berlaku untuk: SQL Server 2012 (11.x) dan yang lebih baru.

Contoh berikut menggunakan NEAR untuk mencari "bracket" dan "reflector" dekat satu sama lain dalam Production.Document tabel. Hanya baris dengan nilai peringkat 50 atau lebih tinggi yang dikembalikan.

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  

Catatan

Jika kueri teks lengkap tidak menentukan bilangan bulat sebagai jarak maksimum, dokumen yang hanya berisi hit yang kesenjangannya lebih besar dari 100 istilah logis tidak akan memenuhi persyaratan NEAR, dan peringkatnya akan menjadi 0.

D. Mengembalikan 5 hasil peringkat teratas menggunakan top_n_by_rank

Contoh berikut mengembalikan deskripsi 5 produk teratas di mana Description kolom berisi kata "aluminium" di dekat kata "terang" atau kata "ringan".

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. Menentukan argumen BAHASA

Contoh berikut menunjukkan penggunaan LANGUAGE argumen .

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  

Catatan

Argumen LANGUAGE language_term tidak diperlukan untuk menggunakan top_n_by_rank.

Lihat Juga

Batasi Hasil Pencarian dengan RANK
Kueri dengan Pencarian Teks Lengkap
Membuat Kueri Pencarian Teks Lengkap (Alat Database Visual)
CONTAINS (Transact-SQL)
Kueri dengan Pencarian Teks Lengkap
SELECT (Transact-SQL)
FROM (Transact-SQL)