CONTAINSTABLE (Transact-SQL)
Gilt für: SQL Server
Azure SQL-Datenbank
Azure SQL verwaltete Instanz
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 SELECT-Anweisung verwendet und als regulärer Tabellenname referenziert. Es führt eine SQL Server-Volltextsuche in Volltextspalten aus, die zeichenbasierte Datentypen enthalten.
CONTAINSTABLE ist nützlich für dieselben Arten von Übereinstimmungen wie das CONTAINS-Prädikat und verwendet dieselben 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. 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. Bei der Abfrage einer Sicht kann nur eine volltextindizierte Basistabelle verwendet werden.
Tabelle kann keinen Servernamen angeben und kann nicht in Abfragen für verknüpfte Server verwendet werden.
column_name
Der Name einer oder mehreren Spalten, die für die Volltextsuche indiziert werden. 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.
LANGUAGE language_term
Ist die Sprache, deren Ressourcen als Teil der Abfrage zum Entfernen von Wörtern, Worttrennung, Wortstammerkennung und Thesaurus und Füllwort (oder Stopword) 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 steigern.
Wenn sie als Zeichenfolge angegeben wird, entspricht language_term dem Aliasspaltenwert 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.
Wird der Wert im Format Doppelbyte-Zeichensatz (Double-Byte Character Set, DBCS) angegeben, wird er von Microsoft SQL Server in Unicode konvertiert.
Wenn die angegebene Sprache nicht gü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 (Transact-SQL).For information about search conditions, see 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 enthält eine Spalte mit dem Namen KEY , die Volltextschlüsselwerte enthält. Jede indizierte Volltexttabelle verfügt über eine Spalte, deren Werte garantiert eindeutig sind, und die in der SCHLÜSSELspalte 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. Um die ID der Spalte abzurufen, die dem Volltextschlüssel des Volltextindex zugeordnet ist, verwenden Sie sys.fulltext_indexes. 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 mit dem Namen RANK. Die RANG-Spalte ist ein Wert (von 0 bis 1000) für jede Zeile, die angibt, wie gut eine Zeile den Auswahlkriterien entspricht. 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. Einfaches Beispiel
Im folgenden Beispiel wird eine einfache Tabelle mit zwei Spalten erstellt und aufgefüllt, wobei 3 Counties und die Farben in ihren Flags aufgelistet werden. Er erstellt und füllt einen Volltextkatalog und index in der Tabelle auf. 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, eine höhere Rangfolge als Italien, die nur eine der abgefragten Farben enthalten.
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. 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 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 sind als ein angegebener Wert
Gilt für: SQL Server 2012 (11.x) und höher. |
Im folgenden Beispiel wird in der bracket
-Tabelle mit NEAR nach "reflector
" in der Nähe von "Production.Document
" gesucht. 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 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.
D: 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 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. 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.
Weitere Informationen
Einschränken von Suchergebnissen mit RANK
Abfragen mit Volltextsuche
Erstellen von Volltextsuchabfragen (Visual Database Tools)
CONTAINS (Transact-SQL)
Abfragen mit Volltextsuche
SELECT (Transact-SQL)
FROM (Transact-SQL)