Freigeben über


CONTAINSTABLE (Transact-SQL)

Gibt eine Tabelle mit keiner, einer oder mehreren Zeilen für jene Spalten zurück, die präzise oder weniger präzise (fuzzy) Übereinstimmungen mit einzelnen Wörtern bzw. Ausdrücken aufweisen, die den Abstand von Wörtern oder gewichtete Treffer enthalten. CONTAINSTABLE wird in der FROM-Klausel einer Transact-SQL-SELECT-Anweisung verwendet und es wird analog zu einem regulären Tabellennamen darauf verwiesen. Es wird eine SQL Server-Volltextsuche für volltextindizierten Spalten mit zeichenbasierten Datentypen durchgeführt.

CONTAINSTABLE ist für dieselben Arten von Übereinstimmungen geeignet wie das CONTAINS-Prädikat und verwendet die gleichen Suchbedingungen wie CONTAINS.

Im Gegensatz zu CONTAINS werden bei Abfragen mit CONTAINSTABLE ein Relevanzrangfolgenwert (Relevance Ranking Value, RANK) und ein Volltextschlüssel (KEY) für jede Zeile zurückgeben.

HinweisHinweis

Informationen zu den Formen der Volltextsuche, die von SQL Server unterstützt werden, finden Sie unter Abfragen mit Volltextsuche.

Themenlink (Symbol) Transact-SQL-Syntaxkonventionen

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

Argumente

  • table
    Der Name einer Tabelle, die volltextindiziert wurde. table kann ein ein-, zwei-, drei- oder vierteiliger Name eines Datenbankobjekts sein. Bei der Abfrage einer Sicht kann nur eine volltextindizierte Basistabelle verwendet werden.

    table kann keinen Servernamen angeben und kann für Abfragen auf Verbindungsservern nicht verwendet werden.

  • column_name
    Der Name einer oder mehreren Spalten, die für die Volltextsuche indiziert werden. Die Spalten können vom Datentyp char, varchar, nchar, nvarchar, text, ntext, image, xml, varbinary oder varbinary(max) sein.

  • column_list
    Gibt an, dass verschiedene, durch Trennzeichen getrennte Spalten angegeben werden können. column_list muss in Klammern eingeschlossen werden. Sofern nicht language_term angegeben ist, muss die Sprache aller Spalten von column_list identisch sein.

  • *
    Gibt an, dass alle volltextindizierten Spalten der table für die Suche nach der angegebenen Suchbedingung verwendet werden sollen. Sofern language_term nicht angegeben ist, muss die Sprache aller Spalten in der Tabelle identisch sein.

  • LANGUAGE language_term
    Die Sprache, deren Ressourcen für die Wörtertrennung, Wortformengenerierung und den Thesaurus sowie die Entfernung von Füllwörtern (oder Stoppwörtern) im Rahmen der Abfrage verwendet werden. Dieser Parameter ist optional und kann als Zeichenfolge, ganze Zahl oder Hexadezimalwert entsprechend dem Gebietsschemabezeichner (Locale Identifier – LCID) einer Sprache angegeben werden. Wird language_term angegeben, wird die entsprechende Sprache auf alle Elemente der Suchbedingung angewendet. Wird kein Wert angegeben, wird die Volltextsprache der Spalte verwendet.

    Wenn Dokumente anderer Sprachen zusammen als BLOBs (Binary Large Objects) in einer einzelnen Spalte gespeichert werden, legt der Gebietsschemabezeichner (LCID) eines bestimmten Dokuments die zur Indizierung seines Inhalts zu verwendende Sprache fest. Beim Abfragen einer solchen Spalte kann die Angabe von LANGUAGE language_term die Wahrscheinlichkeit einer hohen Übereinstimmung erhöhen.

    In Form einer Zeichenfolge entspricht language_term dem Wert der alias-Spalte in der sys.languages-Kompatibilitätsansicht. Die Zeichenfolge muss in einfache Anführungszeichen gesetzt werden, wie z. B. 'language_term'. In Form einer ganzen Zahl ist language_term der eigentliche Gebietsschemabezeichner, der die Sprache identifiziert. In Form eines Hexadezimalwerts ist language_term gleich 0x, gefolgt vom Hexadezimalwert des Gebietsschemabezeichners. Der Hexadezimalwert darf acht Ziffern nicht überschreiten, einschließlich führender Nullen.

    Wird der Wert im Format Doppelbyte-Zeichensatz (Double-Byte Character Set, DBCS) angegeben, wird er von Microsoft SQL Server in Unicode konvertiert.

    Ist die angegebene Sprache ungültig oder sind keine Ressourcen installiert, die dieser Sprache entsprechen, gibt SQL Server einen Fehler zurück. Geben Sie 0x0 als language_term an, um neutrale Sprachressourcen zu verwenden.

  • top_n_by_rank
    Gibt an, dass nur die n höchsten Übereinstimmungen in absteigender Reihenfolge zurückgegeben werden. Wird nur angewendet, wenn ein ganzzahliger Wert n angegeben ist. Wenn top_n_by_rank mit anderen Parametern kombiniert wird, werden von der Abfrage möglicherweise weniger Zeilen zurückgegeben als die Anzahl Zeilen, die mit allen Prädikaten übereinstimmen. Mit top_n_by_rank können Sie die Abfrageleistung erhöhen, indem Sie nur die relevantesten Treffer erneut aufrufen.

  • <contains_search_condition>
    Gibt den Suchtext in column_name und die Bedingungen für eine Übereinstimmung an. Informationen zu Suchbedingungen finden Sie unter CONTAINS (Transact-SQL).

Hinweise

Volltextprädikate und -funktionen gelten für eine einzelne Tabelle, die im FROM-Prädikat enthalten ist. Um eine Suche in mehreren Tabellen auszuführen, können Sie eine verknüpfte Tabelle in der FROM-Klausel verwenden, um in einem Resultset zu suchen, das aus mindestens zwei Tabellen erstellt wird.

Die zurückgegebene Tabelle besitzt eine Spalte namens KEY, die Volltextschlüsselwerte enthält. Jede volltextindizierte Tabelle besitzt eine Spalte, deren Werte garantiert nur einmal vorkommen. Die Werte, die in der Spalte KEY zurückgegeben werden, sind die Volltextschlüsselwerte der Zeilen, die mit dem Auswahlkriterium übereinstimmen, das in der CONTAINS-Suchbedingung angegeben ist. Die TableFulltextKeyColumn-Eigenschaft, die mit der OBJECTPROPERTYEX-Funktion bestimmt werden kann, stellt die Identität für diese eindeutige Schlüsselspalte bereit. Verwenden Sie sys.fulltext_indexes, um die ID der Spalte abzurufen, die dem Volltextschlüssel des Volltextindexes zugeordnet ist. Weitere Informationen finden Sie unter sys.fulltext_indexes (Transact-SQL).

Geben Sie einen Join mit den CONTAINSTABLE-Zeilen an, um die gewünschten Zeilen der Originaltabelle zu erhalten. CONTAINSTABLE wird meist in folgender Form in der FROM-Klausel einer SELECT-Anweisung verwendet:

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]

Die von CONTAINSTABLE erstellte Tabelle enthält eine Spalte namens RANK. Die RANK-Spalte enthält für jede Zeile einen Wert (von 0 bis 1000), der angibt, wie gut eine Zeile mit dem Auswahlkriterium übereinstimmt. Dieser Rangwert wird in der SELECT-Anweisung üblicherweise auf folgende Weise verwendet:

  • In der ORDER BY-Klausel, um die Zeilen, die in der Rangfolge oben liegen, als erste Zeilen der Tabelle zurückzugeben.

  • In der Auswahlliste, um den zugeordneten Rangfolgenwert jeder Zeile anzuzeigen.

Berechtigungen

Ausführungsberechtigungen sind nur für Benutzer mit den entsprechenden SELECT-Privilegien für die Tabelle oder die referenzierten Tabellenspalten verfügbar.

Beispiele

A.Zurückgeben von Rangwerten

Im folgenden Beispiel wird nach allen Produktnamen gesucht, die die Wörter "frame", "whell" oder "tire" enthalten, wobei jedes Wort anders gewichtet wird. Für jede zurückgegebene Zeile, die dieses Suchkriterium erfüllt, wird die relative Nähe (Rangfolgenbewertung) der Übereinstimmung angezeigt. Darüber hinaus werden die Zeilen, die die höchste Einstufung erhielten, als Erstes zurückgegeben.

USE AdventureWorks2012
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

B.Zurückgeben von Rangwerten, die größer sind als ein angegebener Wert

Im folgenden Beispiel wird in der Production.Document-Spalte der AdventureWorks2008-Datenbank mit NEAR nach "bracket" in der Nähe von "reflector" gesucht. Ausschließlich Zeilen mit einem Rangwert von mindestens 50 werden zurückgegeben.

USE AdventureWorks2012
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
HinweisHinweis

Wenn eine Volltextabfrage keine ganze Zahl als maximalen Abstand angibt, entspricht ein Dokument, das nur Treffer enthält, deren Abstand größer als 100 logische Begriffe ist, die NEAR-Anforderungen nicht, und der Rang ist 0.

C.Zurückgeben der obersten 5 Ergebnisse mithilfe von top_n_by_rank

Im folgenden Beispiel wird die Beschreibung der ersten 5 Produkte zurückgegeben, bei denen die Description-Spalte das Wort "aluminium" in der Nähe des Worts "light" oder "lightweight" enthält.

USE AdventureWorks2012
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

D.Angeben des LANGUAGE-Arguments

Im folgenden Beispiel wird die Verwendung des LANGUAGE-Arguments dargestellt.

USE AdventureWorks2012
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
HinweisHinweis

Das LANGUAGE-language_term Argument ist nicht erforderlich für die Verwendung von top_n_by_rank.

Siehe auch

Aufgaben

Erstellen von Volltextsuchabfragen (Visual Database Tools)

Verweis

CONTAINS (Transact-SQL)

SELECT (Transact-SQL)

FROM (Transact-SQL)

Konzepte

Einschränken von Suchergebnissen mit RANK

Abfragen mit Volltextsuche

Abfragen mit Volltextsuche