CONTAINSTABLE (Transact-SQL)

Aktualisiert: 17. Juli 2006

Gibt eine Tabelle mit keiner, einer oder mehreren Zeilen für jene Spalten zeichenbasierter 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 in der FROM-Klausel einer SELECT-Anweisung so 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 der Tabelle, die für die Volltextabfrage gekennzeichnet wurde. table kann ein ein-, zwei-, drei- oder vierteiliger Datenbankobjekt-Name sein.
  • column_name
    Der Name der zu durchsuchenden Spalte, die sich in table befindet. Spalten vom Typ char, varchar, nchar, nvarchar, text, ntext, image, xml, binary und varbinary sind gültige Spalten für die Volltextsuche.
  • column_list
    Gibt an, dass verschiedene, durch Komma 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 Spalten der Tabelle, die für die Volltextsuche registriert wurden, für die Suche nach der angegebenen CONTAINS-Suchbedingung verwendet werden sollen. Ist mehr als eine Tabelle in der FROM-Klausel vorhanden, muss das *-Argument durch den Tabellennamen gekennzeichnet werden. 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, Wortformengenerierung und den Thesaurus sowie die Entfernung von Füllwörtern im Rahmen der CONTAINS-Abfrage verwendet werden. Dieser Parameter ist optional und kann als Zeichenfolge, ganze Zahl oder Hexadezimalwert entsprechend dem Gebietsschemabezeichner (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.

    In Form einer Zeichenfolge entspricht language_term dem Wert der alias-Spalte in der syslanguages-Systemtabelle. 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 Hexadezimalwertes 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 weitere Filter verwendet werden, können weniger als n Ergebnisse zurückgegeben werden.
  • <contains_search_condition>
    Gibt den Suchtext in column_name und die Bedingungen für eine Übereinstimmung an. Weitere Informationen finden Sie unter CONTAINS (Transact-SQL).

Hinweise

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 eine Verknüpfung 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 ausgewählten Liste, um den Rangwert anzuzeigen, der jeder Zeile 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

Die Ausführungsberechtigungen stehen nur den Anwendern mit den entsprechenden SELECT-Privilegien für die Tabelle oder die Tabellenspalten, auf die verwiesen wird, zur Verfügung.

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.

ms189760.note(de-de,SQL.90).gifHinweis:
Zum Ausführen dieses Beispiels muss die Northwind-Datenbank installiert werden. Informationen zum Installieren der Northwind-Datenbank finden Sie unter Downloaden der Beispieldatenbanken Northwind und pubs.
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 mit 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. Alle Zeilen mit dem Kategorienamen Seafood werden nicht berücksichtigt. Ausschließlich Zeilen mit einem Rangwert von 2 oder höher werden zurückgegeben.

ms189760.note(de-de,SQL.90).gifHinweis:
Zum Ausführen dieses Beispiels muss die Northwind-Datenbank installiert werden. Informationen zum Installieren der Northwind-Datenbank finden Sie unter Downloaden der Beispieldatenbanken Northwind und pubs.
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.

ms189760.note(de-de,SQL.90).gifHinweis:
Zum Ausführen dieses Beispiels muss die Northwind-Datenbank installiert werden. Informationen zum Installieren der Northwind-Datenbank finden Sie unter Downloaden der Beispieldatenbanken Northwind und pubs.
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];

ms189760.note(de-de,SQL.90).gifHinweis:
Das LANGUAGE language_term -Argument ist für die Verwendung von top_n_by_rank. nicht erforderlich.

Siehe auch

Verweis

CONTAINS (Transact-SQL)
Rowsetfunktionen (Transact-SQL)
SELECT (Transact-SQL)
WHERE (Transact-SQL)

Andere Ressourcen

Abfragen von SQL Server mithilfe der Volltextsuche

Hilfe und Informationen

Informationsquellen für SQL Server 2005

Änderungsverlauf

Version Verlauf

17. Juli 2006

Neuer Inhalt:
  • Das Beispiel für das LANGUAGE-Argument wurde hinzugefügt.