CONTAINSTABLE (Transact-SQL)

Gibt eine Tabelle mit keiner, einer oder mehreren Zeilen für jene Spalten mit zeichenbasierten Datentypen 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. Auf CONTAINSTABLE kann nur in der FROM-Klausel einer SELECT-Anweisung so darauf verwiesen werden, als ob es ein regulärer Tabellenname wäre.

Abfragen, die CONTAINSTABLE verwenden, sind CONTAINS-Volltextabfragen, die für jede Zeile einen Relevanzrangfolgenwert (Relevance Ranking Value, RANK) und einen Volltextschlüssel (KEY) zurückgeben. Die CONTAINSTABLE-Funktion verwendet die gleichen Suchbedingungen wie das CONTAINS-Prädikat.

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 > 
    | < 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 ] ) 
< proximity_term > ::= 
     { < simple_term > | < prefix_term > } 
     { { NEAR | ~ } { < simple_term > | < prefix_term > } } [ ...n ] 
< 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 Datenbankobjekt-Name sein. Bei der Abfrage einer Sicht kann nur eine volltextindizierte Basistabelle verwendet werden.

    table kann keinen Servernamen angeben und nicht für Abfragen auf Verbindungsservern 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 Spalten, die durch ein Komma getrennt sind, festgelegt werden können. column_list muss in Klammern eingeschlossen werden. Sofern language_term nicht angegeben ist, muss die Sprache aller Spalten von column_list identisch sein.

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

  • LANGUAGE language_term
    Die Sprache, deren Ressourcen für die Wörtertrennung, Wortstammerkennung 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. Wenn Sie language_term angeben, wird die entsprechende Sprache auf alle Elemente der Suchbedingung angewendet. Wenn Sie keinen Wert angeben, 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 durch Angeben von LANGUAGElanguage_term die Wahrscheinlichkeit einer hohen Übereinstimmung gesteigert werden.

    In Form einer Zeichenfolge entspricht language_term dem Wert der alias-Spalte in der sys.syslanguages-Kompatibilitätssicht. Die Zeichenfolge muss in einfache Anführungszeichen eingeschlossen werden, z. B. 'language_term'. In Form einer ganzen Zahl ist language_term der eigentliche Gebietsschemabezeichner (LCID), 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 MicrosoftSQL 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 nhö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 von Zeilen, die eigentlich mit allen Prädikaten übereinstimmen. top_n_by_rank ermöglicht die Steigerung der Abfrageleistung, indem nur die relevantesten Treffer erneut abgerufen werden.

  • <contains_search_condition>
    Gibt den Suchtext in column_name und die Bedingungen für eine Übereinstimmung an. Weitere 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 zwei oder mehr 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 in der CONTAINS-Suchbedingung angegebenen Auswahlkriterium übereinstimmen. 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 eine Verknüpfung mit den CONTAINSTABLE-Zeilen an, um die gewünschten Zeilen der Originaltabelle abzurufen. 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 den Auswahlkriterien übereinstimmt. Dieser Rangwert wird in der SELECT-Anweisung üblicherweise auf folgende Weisen verwendet:

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

  • In der ausgewählten Liste, um den Rangwert anzuzeigen, der den einzelnen Zeilen zugeordnet ist.

CONTAINSTABLE wird nicht als Schlüsselwort erkannt, wenn der Kompatibilitätsgrad kleiner als 70 ist. Weitere Informationen finden Sie unter sp_dbcmptlevel (Transact-SQL).

Berechtigungen

Nur Benutzer mit den entsprechenden SELECT-Privilegien für die Tabelle oder die Tabellenspalten, auf die verwiesen wird, verfügen über Ausführungsberechtigungen.

Beispiele

A. Zurückgeben von Rangwerten mithilfe von CONTAINSTABLE

Im folgenden Beispiel wird nach allen Produktnamen gesucht, die die Wörter "breads", "fish" oder "beers" 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 Northwind;
GO
SELECT FT_TBL.CategoryName, FT_TBL.Description, KEY_TBL.RANK
    FROM Categories AS FT_TBL 
        INNER JOIN CONTAINSTABLE(Categories, Description, 
        'ISABOUT (breads weight (.8), 
        fish weight (.4), beers weight (.2) )' ) AS KEY_TBL
            ON FT_TBL.CategoryID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC;
GO

B. Zurückgeben von Rangwerten, die größer als der mithilfe von CONTAINSTABLE angegebene Wert sind

Im folgenden Beispiel werden die Beschreibung und der Kategoriename aller Essenskategorien zurückgegeben, für die in der Description-Spalte die Wörter "sweet and savory" in der Nähe des Wortes sauces oder des Wortes candies enthalten sind. Zeilen mit dem Kategorienamen Seafood werden nicht berücksichtigt. Ausschließlich Zeilen mit einem Rangwert von 2 oder höher werden zurückgegeben.

USE Northwind;
GO
SELECT FT_TBL.Description, FT_TBL.CategoryName, KEY_TBL.RANK
FROM Categories AS FT_TBL 
    INNER JOIN CONTAINSTABLE (Categories, Description, 
        '("sweet and savory" NEAR sauces) OR
        ("sweet and savory" NEAR candies)'
        ) AS KEY_TBL
        ON FT_TBL.CategoryID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 2
    AND FT_TBL.CategoryName <> 'Seafood'
ORDER BY KEY_TBL.RANK DESC;
GO

C. Zurückgeben der obersten 10 Ergebnisse mithilfe von CONTAINSTABLE und top_n_by_rank

In diesem Beispiel werden die Beschreibung und der Kategoriename der obersten zehn Essenskategorien zurückgegeben, in denen in der Description-Spalte die Wörter "sweet and savory" in der Nähe eines der Wörter "sauces" oder "candies" vorhanden sind.

USE Northwind;
SELECT FT_TBL.Description, FT_TBL.CategoryName , KEY_TBL.RANK
FROM Categories AS FT_TBL 
    INNER JOIN CONTAINSTABLE (Categories, Description, 
        '("sweet and savory" NEAR sauces) OR
        ("sweet and savory" NEAR candies)', 10)
        AS KEY_TBL
        ON FT_TBL.CategoryID = KEY_TBL.[KEY]

GO

D. Angeben des LANGUAGE-Arguments

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

USE Northwind;
SELECT FT_TBL.Description , FT_TBL.CategoryName , KEY_TBL.RANK
FROM dbo.Categories AS FT_TBL 
    INNER JOIN CONTAINSTABLE (dbo.Categories, Description, 
        '("sweet and savory" NEAR sauces) OR
        ("sweet and savory" NEAR candies)',LANGUAGE N'English', 10) 
        AS KEY_TBL
        ON FT_TBL.CategoryID = KEY_TBL.[KEY];
HinweisHinweis

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