Freigeben über


CONTAINSTABLE (Transact-SQL)

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed Instance

Gibt eine Tabelle mit Null, einer oder mehreren Zeilen für diese Spalten zurück, die präzise oder fuzzy (weniger präzise) Übereinstimmungen mit einzelnen Wörtern und Ausdrücken, die Nähe von Wörtern innerhalb eines bestimmten Abstands voneinander oder gewichtete Übereinstimmungen enthalten. CONTAINSTABLE wird in der FROM-Klausel einer Transact-SQL-Anweisung SELECT verwendet und wird so referenziert, als ob es sich um einen regulären Tabellennamen handelt. Es führt eine SQL Server-Volltextsuche in Volltextspalten aus, die zeichenbasierte Datentypen enthalten.

CONTAINSTABLE ist nützlich für die gleichen Arten von Übereinstimmungen wie das CONTAINS und verwendet dieselben Suchbedingungen wie CONTAINS.

Im Gegensatz dazu CONTAINSgeben Abfragen, die CONTAINSTABLE einen Relevanzrangfolgewert (RANK) und einen Volltextschlüssel (KEY) für jede Zeile verwenden, zurück. Informationen zu den Formen der Volltextsuche, die von SQL Server unterstützt werden, finden Sie unter Abfragen mit Volltextsuche.

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

Tabelle

Der Name einer Tabelle, die volltextindiziert wurde. Eine Tabelle kann ein Ein-, Zwei-, Drei- oder vierteiliges Datenbankobjektname sein. Wenn Sie eine Ansicht abfragen, kann nur eine volltextindizierte Basistabelle einbezogen werden.

Eine Tabelle kann keinen Servernamen angeben und kann nicht in Abfragen für verknüpfte Server verwendet werden.

column_name

Der Name einer oder mehrerer Spalten, die für die Volltextsuche indiziert sind. Die Spalten können vom Typ 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 stehen. Sofern nicht language_term angegeben ist, muss die Sprache aller Spalten von column_list identisch sein.

*

Gibt an, dass alle indizierten Volltextspalten in der Tabelle verwendet werden sollen, um nach der angegebenen Suchbedingung zu suchen. Sofern language_term nicht angegeben ist, muss die Sprache aller Spalten in der Tabelle identisch sein.

SPRACHLICHE language_term

Die Sprache, deren Ressourcen zum Entfernen von Wörtern im Rahmen der Abfrage verwendet werden, um Worttrennung, Wortstammerkennung und Thesaurus und Rauschwort (oder Stoppwort) zu entfernen. Dieser Parameter ist optional und kann als Zeichenfolge, ganze Zahl oder Hexadezimalwert entsprechend dem Gebietsschemabezeichner (Locale Identifier – LCID) einer Sprache angegeben werden. Wenn language_term angegeben ist, wird die sprache, die sie darstellt, 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. Wenn Sie eine solche Spalte abfragen, geben Sie an LANGUAGE <language_term> , dass die Wahrscheinlichkeit einer guten Übereinstimmung erhöht wird.

Bei Angabe als Zeichenfolge entspricht language_term dem alias Spaltenwert in der Kompatibilitätsansicht "sys.syslanguages ". Die Zeichenfolge muss in einfache Anführungszeichen gesetzt werden, 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.

Wenn sich der Wert im DBCS-Format (Double-Byte Character Set) befindet, konvertiert SQL Server ihn in Unicode.

Wenn die angegebene Sprache ungültig ist oder keine Ressourcen installiert sind, 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. Gilt nur, wenn ein ganzzahliger Wert (n) angegeben wird. 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 mit allen Prädikaten übereinstimmen. mit top_n_by_rank können Sie die Abfrageleistung erhöhen, indem Sie nur die relevantesten Treffer zurückrufen.

<contains_search_condition>

Gibt den Suchtext in column_name und die Bedingungen für eine Übereinstimmung an. Informationen zu Suchbedingungen finden Sie unter CONTAINS.

Hinweise

Volltext-Prädikate und -funktionen arbeiten an einer einzelnen Tabelle, die im FROM Prädikat impliziert wird. Um nach mehreren Tabellen zu suchen, verwenden Sie eine verknüpfte Tabelle in Ihrer FROM Klausel, um nach einem Resultset zu suchen, das das Produkt von zwei oder mehr Tabellen ist.

Die zurückgegebene Tabelle enthält eine Spalte mit dem Namen KEY Volltextschlüsselwerte. Jede indizierte Volltexttabelle verfügt über eine Spalte, deren Werte garantiert eindeutig sind, und die in der KEY Spalte zurückgegebenen Werte sind die Volltextschlüsselwerte der Zeilen, die den in der Suchbedingung angegebenen Auswahlkriterien entsprechen. Die TableFulltextKeyColumn Eigenschaft, die von der OBJECTPROPERTYEX Funktion abgerufen wird, stellt die Identität dieser eindeutigen Schlüsselspalte bereit. Weitere Informationen finden Sie unter sys.fulltext_indexes, um die ID der Spalte abzurufen, die dem Volltextschlüssel des Volltextindex zugeordnet ist.

Um die gewünschten Zeilen aus der ursprünglichen Tabelle abzurufen, geben Sie eine Verknüpfung mit den CONTAINSTABLE Zeilen an. Die typische Form der FROM Klausel für eine SELECT verwendete CONTAINSTABLE Anweisung lautet:

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 der Tabelle erstellte Tabelle enthält eine Spalte mit dem Namen RANK. Die RANK Spalte ist ein Wert (zwischen 0 und 1000) für jede Zeile, der angibt, wie gut eine Zeile den Auswahlkriterien entspricht. Dieser Rangwert wird in der Regel auf eine der folgenden Arten in der SELECT Anweisung verwendet:

  • Geben Sie in der ORDER BY Klausel die Zeilen mit der höchsten Rangfolge als erste Zeilen in der Tabelle zurück.

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

Berechtigungen

Ausführungsberechtigungen sind nur für Benutzer mit den entsprechenden SELECT Berechtigungen für die Tabelle oder die Spalten der referenzierten Tabelle verfügbar.

Beispiele

Ein. Einfaches Beispiel

Im folgenden Beispiel wird eine einfache Tabelle mit zwei Spalten erstellt und aufgefüllt, in der drei Länder/Regionen und die Farben in ihren Flags aufgelistet werden. Er erstellt und füllt einen Volltextkatalog und index auf der Tabelle. Anschließend wird die CONTAINSTABLE Syntax veranschaulicht. In diesem Beispiel wird veranschaulicht, wie der Rangwert höher wird, wenn der Suchwert mehrmals erfüllt wird. In der letzten Abfrage hat Tansania, das sowohl Grün als auch Schwarz enthält, einen höheren Rang als Italien, der nur eine der abgefragten Farben enthält.

CREATE TABLE Flags
(
    CountryOrRegion NVARCHAR (30) NOT NULL,
    FlagColors VARCHAR (200)
);

CREATE UNIQUE CLUSTERED INDEX FlagKey ON Flags(CountryOrRegion);

INSERT INTO Flags VALUES ('France', 'Blue and White and Red');
INSERT INTO Flags VALUES ('Italy', 'Green and White and Red');
INSERT INTO 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. Zurückgeben von Rangwerten

Im folgenden Beispiel werden alle Produktnamen gesucht, die die Wörter frame, wheel, oder tire, und verschiedene Gewichtungen werden jedem Wort zugewiesen. Für jede zurückgegebene Zeile, die diesen Suchkriterien entspricht, wird die relative Nähe (Rangfolgenwert) der Übereinstimmung angezeigt. Darüber hinaus werden die Zeilen, die die höchste Einstufung erhielten, als Erstes zurückgegeben.

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. Zurückgeben von Rangwerten, die größer als ein angegebener Wert sind

Gilt für: SQL Server 2012 (11.x) und höhere Versionen.

Im folgenden Beispiel wird NEAR verwendet, um in der bracket Tabelle nacheinander zu suchen reflector und Production.Document zu schließen. Es werden nur Zeilen mit einem Rangwert von 50 oder höher zurückgegeben.

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

Hinweis

Wenn eine Volltextabfrage keine ganze Zahl als maximale Entfernung angibt, erfüllt ein Dokument, das nur Treffer enthält, deren Abstand größer als 100 logische Ausdrücke ist, die die NEAR Anforderungen nicht erfüllen, und die Rangfolge ist 0.

D: Zurückgeben der fünf besten bewerteten Ergebnisse mithilfe von top_n_by_rank

Im folgenden Beispiel wird die Beschreibung der fünf obersten Produkte zurückgegeben, bei denen die Description Spalte das Wort aluminum in der Nähe des Worts light oder des Worts lightweightenthält.

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

E. Angeben des LANGUAGE-Arguments

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

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

Hinweis

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