Sdílet prostřednictvím


CONTAINSTABLE (Transact-SQL)

platí pro:SQL ServerAzure SQL Databaseazure SQL Managed Instance

Vrátí tabulku s nulovou, jednou nebo více řádky pro tyto sloupce obsahující přesné nebo přibližné shody (méně přesné) s jedním slovem a frázemi, blízkosti slov v určité vzdálenosti od sebe nebo vážených shod. CONTAINSTABLE se používá v klauzuli FROM příkazu Transact-SQL SELECT a odkazuje se, jako by se jednalo o běžný název tabulky. Provádí fulltextové vyhledávání SQL Serveru u fulltextových indexovaných sloupců obsahujících datové typy založené na znakech.

FUNKCE CONTAINSTABLE je užitečná pro stejné druhy shod jako PREdikát CONTAINS a používá stejné podmínky hledání jako CONTAINS.

Na rozdíl od funkce CONTAINS však dotazy používající funkci CONTAINSTABLE vrátí hodnotu řazení podle relevance (RANK) a fulltextový klíč (KEY) pro každý řádek. Informace o formách fulltextového vyhledávání, které sql Server podporuje, najdete v tématu Query s Full-Text Search.

Transact-SQL konvence syntaxe

Syntax

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

Argumenty

tabulky
Je název tabulky, která byla indexována fulltextem. tabulce může být název databázového objektu 1, dvou, tří nebo čtyřdílných. Při dotazování zobrazení může být zahrnuta pouze jedna fulltextová indexovaná základní tabulka.

tabulka nemůže zadat název serveru a nelze ho použít v dotazech na odkazované servery.

column_name
Je název jednoho nebo více sloupců, které jsou indexovány pro fulltextové vyhledávání. Sloupce můžou být typu znak, varchar, nchar, nvarchar, textové,ntext, obrázku, xml, varbinárnínebo varbinary(max).

column_list
Označuje, že je možné zadat několik sloupců oddělených čárkou. column_list musí být uzavřeny v závorkách. Pokud není zadán language_term, musí být jazyk všech sloupců column_list stejný.

*
Určuje, že všechny fulltextové indexované sloupce v tabulce by se měly použít k vyhledání dané podmínky hledání. Pokud není zadán language_term, musí být jazyk všech sloupců tabulky stejný.

LANGUAGE_TERM JAZYKA
Je jazyk, jehož prostředky budou použity pro dělení slov, vytváření a tesaurus a šum-slovo (nebo stopword) odebrání v rámci dotazu. Tento parametr je volitelný a lze jej zadat jako řetězec, celé číslo nebo šestnáctkovou hodnotu odpovídající identifikátoru národního prostředí (LCID) jazyka. Pokud je zadán language_term, jazyk, který představuje, se použije na všechny prvky podmínky hledání. Pokud není zadána žádná hodnota, použije se jazyk fulltextu sloupce.

Pokud jsou dokumenty různých jazyků uloženy společně jako binární velké objekty (BLOB) v jednom sloupci, identifikátor národního prostředí (LCID) daného dokumentu určuje, jaký jazyk se používá k indexování jeho obsahu. Při dotazování na takový sloupec může zadání LANGUAGE***language_term zvýšit pravděpodobnost dobré shody.

Při zadání jako řetězec language_term odpovídá aliasu hodnoty sloupce v sys.syslanguages zobrazení kompatibility. Řetězec musí být uzavřený v jednoduchých uvozovkách, jako v "language_term". Pokud je zadáno jako celé číslo, language_term je skutečný identifikátor LCID, který identifikuje jazyk. Pokud je zadaná jako šestnáctková hodnota, language_term je 0x následovaná šestnáctkovou hodnotou LCID. Šestnáctková hodnota nesmí překročit osm číslic, včetně počátečních nul.

Pokud je hodnota ve formátu dvoubajtové znakové sady (DBCS), Microsoft SQL Server ji převede na Unicode.

Pokud zadaný jazyk není platný nebo nejsou nainstalovány žádné prostředky odpovídající danému jazyku, sql Server vrátí chybu. Chcete-li použít neutrální jazykové prostředky, zadejte 0x0 jako language_term.

top_n_by_rank
Určuje, že se vrátí pouze n nejvyšších shod v sestupném pořadí. Platí pouze v případě, že je zadána celočíselná hodnota n. Pokud se top_n_by_rank zkombinuje s jinými parametry, dotaz by mohl vrátit méně řádků než počet řádků, které ve skutečnosti odpovídají všem predikátům. top_n_by_rank umožňuje zvýšit výkon dotazů tím, že si vzpomenete jenom na nejrelevavantnější přístupy.

<contains_search_condition>
Určuje text, který se má vyhledat v column_name a podmínky shody. Informace o podmínkách hledání naleznete v tématu CONTAINS (Transact-SQL).

Poznámky

Predikáty a funkce fulltextu pracují na jedné tabulce, která je odvozena v predikátu FROM. Pokud chcete vyhledat více tabulek, pomocí spojené tabulky v klauzuli FROM vyhledejte sadu výsledků, která je součinem dvou nebo více tabulek.

Vrácená tabulka obsahuje sloupec s názvem KEY, který obsahuje hodnoty fulltextového klíče. Každá fulltextová indexovaná tabulka má sloupec, jehož hodnoty jsou zaručeny jedinečné a hodnoty vrácené ve sloupci KEY jsou fulltextové hodnoty klíče řádků, které odpovídají kritériím výběru zadaným v podmínce hledání. TableFulltextKeyColumn vlastnost získaná z funkce OBJECTPROPERTYEX poskytuje identitu tohoto jedinečného sloupce klíče. Chcete-li získat ID sloupce přidruženého k fulltextovém klíči fulltextového indexu, použijte sys.fulltext_indexes. Další informace naleznete v tématu sys.fulltext_indexes (Transact-SQL).

Chcete-li získat požadované řádky z původní tabulky, zadejte spojení s řádky CONTAINSTABLE. Typická forma klauzule FROM pro příkaz SELECT používající CONTAINSTABLE je:

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

Tabulka vytvořená pomocí CONTAINSTABLE obsahuje sloupec s názvem RANK. Sloupec RANK je hodnota (od 0 do 1000) pro každý řádek označující, jak dobře řádek odpovídal kritériím výběru. Tato hodnota pořadí se obvykle používá jedním z těchto způsobů v příkazu SELECT:

  • V klauzuli ORDER BY vrátí řádky nejvyššího pořadí jako první řádky v tabulce.

  • V seznamu pro výběr zobrazíte hodnotu pořadí přiřazenou každému řádku.

Dovolení

Oprávnění ke spuštění jsou dostupná jenom uživatelům s příslušnými oprávněními SELECT v tabulce nebo sloupcích odkazované tabulky.

Příklady

A. Jednoduchý příklad

Následující příklad vytvoří a naplní jednoduchou tabulku dvou sloupců se seznamem 3 okresů a barev v jejich vlajkách. Vytvoří a naplní fulltextový katalog a index tabulky. Potom se ukáže syntaxe CONTAINSTABLE. Tento příklad ukazuje, jak se hodnota pořadí zvyšuje, když je hodnota hledání splněna vícekrát. V posledním dotazu má Tanzanie, která obsahuje zelenou i černou, vyšší pořadí než Itálie, která obsahuje pouze jednu z dotazovaných barev.

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. Vrácení hodnot pořadí

Následující příklad vyhledá všechny názvy produktů, které obsahují slova "rám", "kolo" nebo "pneumatika", a pro každé slovo se zadají různé váhy. Pro každý vrácený řádek odpovídající těmto kritériím hledání se zobrazí relativní blízkost (hodnota řazení) shody. Kromě toho se jako první vrátí nejvyšší řádky řazení.

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. Vrácení hodnot pořadí větších než zadaná hodnota

platí pro: SQL Server 2012 (11.x) a novější.

Následující příklad používá funkci NEAR k vyhledání "bracket" a "reflector" blízko sebe v tabulce Production.Document. Vrátí se pouze řádky s hodnotou pořadí 50 nebo vyšší.

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  

Poznámka

Pokud fulltextový dotaz nezadá celé číslo jako maximální vzdálenost, dokument, který obsahuje pouze hity, jejichž mezera je větší než 100 logických termínů, nesplňuje požadavky NEAR a jeho pořadí bude 0.

D. Vrácení prvních 5 seřazených výsledků pomocí top_n_by_rank

Následující příklad vrátí popis prvních 5 produktů, kde sloupec Description obsahuje slovo "hliník" poblíž slova "light" nebo slovo "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  

GO

E. Zadání argumentu LANGUAGE

Následující příklad ukazuje použití argumentu 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  

Poznámka

Argument jazyka language_term není vyžadován pro použití top_n_by_rank.

Viz také

Omezit výsledky hledání pomocí RANK
dotaz pomocí hledání Full-Text
vytváření vyhledávacích dotazů Full-Text (Visual Database Tools)
CONTAINS (Transact-SQL)
dotaz pomocí hledání Full-Text
SELECT (Transact-SQL)
FROM (Transact-SQL)