CONTAINS (Transact-SQL)

Dies ist ein Prädikat, das in einer WHERE-Klausel verwendet wird, um Spalten mit zeichenbasierten Datentypen nach genauen oder ungefähren Entsprechungen mit einzelnen Wörtern oder Ausdrücken, Wörtern, die höchstens einen bestimmten Abstand voneinander aufweisen, sowie gewichteten Übereinstimmungen zu durchsuchen.

Sie können in SQL Server vierteilige Namen in CONTAINS- oder FREETEXT-Volltextprädikaten verwenden, um Abfragen für Verbindungsserver auszuführen.

Folgendes kann mit CONTAINS gesucht werden:

  • Ein Wort oder ein Ausdruck.

  • Das Präfix eines Worts oder eines Ausdrucks.

  • Ein Wort, das einem anderen Wort ähnlich ist.

  • Ein Wort, das mithilfe von Beugung aus einem anderen generiert wurde (z. B. stellt das Wort drive den Beugungsstamm von drives, drove, driving und driven dar.)

  • Ein Wort, das ein Synonym für ein anderes Wort ist (das Wort Metall kann z. B. über die Synonyme Aluminium und Stahl verfügen). Dazu wird ein Thesaurus verwendet.

Themenlink (Symbol)Transact-SQL-Syntaxkonventionen

Syntax

CONTAINS
      ( { column_name | ( column_list ) | * } 
          , '<contains_search_condition>'     
   [ , LANGUAGE language_term ]
      ) 

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

<AND> ::= 
     { AND | & }

<AND NOT> ::= 
     { AND NOT | &! }

<OR> ::= 
     { OR | | }

Argumente

  • column_name
    Der Name einer volltextindizierten Spalte der in der FROM-Klausel angegebenen Tabelle. Die Spalten können vom Datentyp char, varchar, nchar, nvarchar, text, ntext, image, xml, varbinary oder varbinary(max) sein.

  • column_list
    Gibt zwei oder mehr durch Trennzeichen getrennte Spalten an. 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 die Abfrage alle volltextindizierten Spalten in der Tabelle durchsucht, die in der FROM-Klausel für die festgelegte Suchbedingung angegeben werden. Die Spalten in der CONTAINS-Klausel müssen aus einer einzelnen Tabelle mit einem Volltextindex stammen. Sofern language_term nicht angegeben ist, muss die Sprache aller Spalten der Tabelle identisch sein.

  • LANGUAGE language_term
    Die Sprache, die für Wörtertrennung, Wortstammerkennung, Thesauruserweiterungen und -ersetzungen sowie die Entfernung von Füllwörtern (oder Stoppwörtern) im Rahmen der Abfrage verwendet werden soll. Dieser Parameter ist optional.

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

    language_term kann als Zeichenfolge, ganze Zahl oder Hexadezimalwert entsprechend dem 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 language_term als Zeichenfolge angegeben wird, entspricht diese dem Wert der alias-Spalte in der sys.syslanguages (Transact-SQL)-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, 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 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.

  • <contains_search_condition>
    Gibt den Suchtext in column_name und die Bedingungen für eine Übereinstimmung an.

    <contains_search_condition> ist vom Datentyp nvarchar. Wird ein anderer Zeichendatentyp als Eingabe verwendet, findet eine implizite Konvertierung statt. Im folgenden Beispiel verursacht die @SearchWord-Variable, die als varchar(30) definiert ist, eine implizite Konvertierung im CONTAINS-Prädikat.

    USE AdventureWorks2008R2;
    GO
    DECLARE @SearchWord varchar(30)
    SET @SearchWord ='performance'
    SELECT Description 
    FROM Production.ProductDescription 
    WHERE CONTAINS(Description, @SearchWord);
    

    Da das "Parametersniffing" zusammen mit der Konvertierung nicht funktionsfähig ist, sollten Sie aus Leistungsgründen nvarchar verwenden. Deklarieren Sie im Beispiel @SearchWord als nvarchar(30).

    USE AdventureWorks2008R2;
    GO
    DECLARE @SearchWord nvarchar(30)
    SET @SearchWord = N'performance'
    SELECT Description 
    FROM Production.ProductDescription 
    WHERE CONTAINS(Description, @SearchWord);
    

    In Fällen, in denen ein nicht optimaler Plan generiert wird, können Sie auch den OPTIMIZE FOR-Abfragehinweis verwenden.

  • word
    Eine Zeichenfolge ohne Leerzeichen oder Satzzeichen.

  • phrase
    Ein Wort oder mehrere Wörter, die durch Leerzeichen getrennt sind.

    HinweisHinweis

    Einige Sprachen, wie z. B. die in einigen Teilen von Asien verwendeten Sprachen, können Ausdrücke besitzen, die aus mehreren Wörtern ohne Leerzeichen bestehen.

  • <simple_term>
    Gibt eine Übereinstimmung für ein genaues Wort oder einen genauen Ausdruck an. Beispiele für gültige einfache Begriffe sind "blue berry", blueberry und "Microsoft SQL Server". Ausdrücke müssen in doppelte Anführungszeichen ("") gesetzt werden. Die Wörter eines Ausdrucks müssen in <contains_search_condition> in der Reihenfolge angegeben werden wie in der Datenbankspalte. Bei der Suche nach Zeichen in einem Wort oder einem Ausdruck wird nicht zwischen Groß- und Kleinschreibung unterschieden. Füllwörter (oder Stoppwörter), z. B. "ein", "und" oder "die", aus volltextindizierten Spalten werden nicht im Volltextindex gespeichert. Ist das einzige gesuchte Wort ein Füllwort, gibt SQL Server eine Fehlermeldung zurück, die angibt, dass lediglich Füllwörter als Suchbegriffe übergeben wurden. SQL Server enthält eine Standardliste aller Füllwörter im Ordner \Mssql\Binn\FTERef für jede Instanz von SQL Server.

    Satzzeichen werden nicht beachtet. Mit CONTAINS(testing, "computer failure") wird daher auch eine Zeile mit dem Wert "Where is my computer? Failure to find it would be expensive." gefunden. Weitere Informationen zum Worttrennungsverhalten finden Sie unter Wörtertrennung und Wortstammerkennung.

  • <prefix_term>
    Gibt eine Suche nach Wörtern oder Ausdrücken an, die mit dem angegebenen Text beginnen. Setzen Sie einen Präfixausdruck (prefix_term) in doppelte Anführungszeichen (""), und setzen Sie ein Sternchen (*) vor das schließende Anführungszeichen, sodass jeglicher Text gefunden wird, der mit dem einfachen Ausdruck beginnt, der vor dem Sternchen steht. Die Klausel sollte wie folgt angegeben werden: CONTAINS (column, '"text*"') Das Sternchen entspricht keinem, einem oder mehreren Zeichen (des Hauptworts bzw. der Hauptwörter im Ausdruck). Wenn der Text und das Sternchen nicht in doppelten Anführungszeichen stehen, sodass das Prädikat als CONTAINS (column, 'text*') gelesen wird, wird das Sternchen bei der Volltextsuche als Zeichen behandelt, und es wird nach exakten Übereinstimmungen mit text* gesucht. Vom Volltextmodul werden keine Wörter mit Sternchen (*) gefunden, da dieses Zeichen in der Regel von der Wörtertrennung ignoriert wird.

    Wenn es sich bei <prefix_term> um einen Ausdruck handelt, wird jedes im Ausdruck vorhandene Wort als separates Präfix behandelt. Daher werden bei einer Abfrage des Präfixbegriffs "local wine*" als Übereinstimmung alle Zeilen mit dem Text "local winery", "locally wined and dined" usw. ausgegeben.

  • <generation_term>
    Gibt eine Suche nach Wörtern an, wenn die enthaltenen einfachen Begriffe Varianten des ursprünglichen Worts enthalten, nach dem gesucht werden soll.

  • INFLECTIONAL
    Gibt an, dass die sprachenabhängige Wortstammerkennung für den angegebenen einfachen Ausdruck verwendet werden soll. Das Verhalten der Wortstammerkennung wird auf der Grundlage von Wortstammerkennungsregeln für jede Sprache einzeln definiert. Der neutralen Sprache ist keine Wortstammerkennung zugeordnet. Auf die gewünschte Wortstammerkennung wird anhand der Spaltensprache der abgefragten Spalten verwiesen. Falls language_term angegeben ist, wird die dieser Sprache entsprechende Wortstammerkennung verwendet.

    Ein angegebener <simple_term> innerhalb eines <generation_term> kann nicht mit Substantiven und mit Verben gleichzeitig übereinstimmen.

  • THESAURUS
    Gibt an, dass der Thesaurus verwendet wird, der der Volltext-Spaltensprache oder der in der Abfrage angegebenen Sprache entspricht. Die längsten Muster aus <simple_term> werden mit dem Thesaurus verglichen, und weitere Ausdrücke werden generiert, um das ursprüngliche Muster zu erweitern oder zu ersetzen. Wird für den ganzen Ausdruck oder für Teile von <simple_term> keine Übereinstimmung gefunden, wird der nicht übereinstimmende Teil als simple_term behandelt. Weitere Informationen zum Thesaurus der Volltextsuche finden Sie unter Thesauruskonfiguration.

  • <proximity_term>
    Legt eine Übereinstimmung für Wörter oder Ausdrücke fest, die im durchsuchten Dokument vorhanden sein müssen. Wie der AND-Operator erfordert <proximity_term>, dass beide Suchbegriffe im durchsuchten Dokument vorhanden sind.

    • NEAR | ~
      Gibt an, dass das Wort oder der Ausdruck auf beiden Seiten des NEAR-Operators bzw. ~-Operators in einem Dokument vorhanden sein muss, damit eine Übereinstimmung zurückgegeben wird. Mehrere solcher Ausdrücke, die nahe beieinander stehen sollen, können wie in a NEAR b NEAR c oder a ~ b ~ c verkettet werden. Damit eine Übereinstimmung zurückgegeben wird, müssen alle verketteten Ausdrücke, die nahe beieinander stehen sollen, im Dokument vorhanden sein.

      Bei Verwendung in einer CONTAINSTABLE-Funktion wirkt sich die Nähe der Suchbegriffe auf den Rang eines jeden Dokuments aus. Je näher die passenden Suchbegriffe in einem Dokument zueinander stehen, desto höher ist der Rang des Dokuments. Wenn übereinstimmende Suchbegriffe >50 Begriffe auseinander liegen, wird für das Dokument der Rang 0 zurückgegeben.

      Beispielsweise würden CONTAINS (column_name, 'Fuchs NEAR Huhn') und CONTAINSTABLE (table_name, column_name, 'Fuchs ~ Huhn') alle Dokumente in der angegebenen Spalte zurückgeben, die sowohl "Fuchs" als auch "Huhn" enthalten. Außerdem gibt CONTAINSTABLE einen nach dem Abstand von "Fuchs" und "Huhn" bestimmten Rang für jedes Dokument zurück. Wenn ein Dokument z. B. den Satz "Der Fuchs fraß das Huhn" enthält, wäre sein Rang hoch.

      NEAR gibt die logische und nicht die absolute Entfernung zwischen Begriffen an. Begriffe, die sich innerhalb eines Absatzes innerhalb verschiedener Ausdrücke oder Sätze befinden, werden beispielsweise als weiter voneinander entfernt behandelt als Begriffe im gleichen Ausdruck oder im gleichen Satz, und zwar unabhängig von ihrer tatsächlichen Nähe und unter der Annahme, dass sie weniger verwandt sind. Begriffe in anderen Absätzen werden entsprechend so behandelt, als wären sie noch weiter entfernt.

  • <weighted_term>
    Gibt an, dass die übereinstimmenden Zeilen (die von der Abfrage zurückgegeben werden) mit einer Liste von Wörtern und Ausdrücken übereinstimmen müssen, die optional jeweils mit einem Gewichtungswert versehen sind.

  • ISABOUT
    Gibt das <weighted_term>-Schlüsselwort an.

    • WEIGHT(weight_value)
      Gibt einen Gewichtungswert von 0,0 bis 1,0 an. Jede Komponente in <weighted_term> kann einen weight_value beinhalten. Mit weight_value kann festgelegt werden, wie verschiedene Teilabfragen die Rangfolge der als Treffer gewerteten Zeilen beeinflussen. WEIGHT hat keine Auswirkung auf die Ergebnisse von CONTAINS-Abfragen, beeinflusst jedoch den Rang in CONTAINSTABLE-Abfragen.

      HinweisHinweis

      Das Dezimaltrennzeichen ist immer ein Punkt, unabhängig vom Betriebssystemgebietsschema.

  • { AND | & } | { AND NOT | &! } | { OR | | }
    Gibt eine logische Operation zwischen zwei CONTAINS-Suchbedingungen an.

    • AND | &
      Gibt an, dass die beiden CONTAINS-Suchbedingungen für eine Übereinstimmung erfüllt sein müssen. Das kaufmännische Und-Zeichen (&) kann an Stelle des AND-SchlüsselWorts zur Darstellung des AND-Operators verwendet werden.

    • AND NOT | &!
      Gibt an, dass die zweite CONTAINS-Suchbedingung für eine Übereinstimmung nicht erfüllt sein muss. Das kaufmännische Und-Zeichen gefolgt von einem Ausrufezeichen (&!) kann an Stelle des AND NOT-SchlüsselWorts zur Darstellung des AND NOT-Operators verwendet werden.

    • OR | |
      Gibt an, dass eine der beiden CONTAINS-Suchbedingungen für eine Übereinstimmung erfüllt sein muss. Der senkrechte Strich (|) kann an Stelle des OR-Schlüsselsorts zur Darstellung des OR-Operators verwendet werden.

      Wenn <contains_search_condition> in Klammern eingeschlossene Gruppen enthält, werden diese zuerst ausgewertet. Nach der Auswertung der in Klammern gesetzten Gruppen gelten folgende Regeln bei der Verwendung der logischen Operatoren mit den CONTAINS-Suchbedingungen:

      • NOT wird vor AND angewendet.

      • NOT kann nur nach AND auftreten, wie in AND NOT. Der Operator OR NOT ist nicht zugelassen. NOT kann nicht vor dem ersten Ausdruck angegeben werden. Beispielsweise ist Folgendes nicht zulässig: CONTAINS (mycolumn, 'NOT "phrase_to_search_for" ' ).

      • AND wird vor OR angewendet.

      • Da boolesche Operatoren des gleichen Typs (AND, OR) assoziativ sind, können sie in beliebiger Reihenfolge angewendet werden.

      • n
        Ein Platzhalter, der anzeigt, dass mehrere CONTAINS-Suchbedingungen und darin enthaltene Begriffe angegeben werden können.

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.

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

Volltextprädikate sind in der OUTPUT-Klausel nicht zulässig, wenn der Kompatibilitätsgrad der Datenbank auf 100 festgelegt ist.

Vergleich zwischen LIKE und der Volltextsuche

Im Gegensatz zur Volltextsuche verarbeitet das LIKE-Transact-SQL-Prädikat ausschließlich Zeichenmuster. Darüber hinaus können Sie mit dem LIKE-Prädikat keine formatierten Binärdaten abfragen. Eine LIKE-Abfrage in umfangreichen unstrukturierten Textdaten ist sehr viel langsamer als eine entsprechende Volltextabfrage in denselben Daten. Eine LIKE-Abfrage für Millionen von Zeilen von Textdaten kann Minuten in Anspruch nehmen; eine Volltextabfrage kann dagegen in Sekunden oder weniger für dieselben Daten ein Ergebnis liefern, je nach Anzahl der zurückgegebenen Zeilen.

Beispiele

A. Verwenden von CONTAINS mit <simple_term>

Im folgenden Beispiel werden alle Produkte mit einem Preis von $80.99 gesucht, die das Wort "Mountain" enthalten.

USE AdventureWorks2008R2;
GO
SELECT Name, ListPrice
FROM Production.Product
WHERE ListPrice = 80.99
   AND CONTAINS(Name, 'Mountain');
GO

B. Verwenden von CONTAINS und einem Ausdruck in <simple_term>

Im folgenden Beispiel werden alle Produkte zurückgegeben, die entweder den Ausdruck "Mountain" oder "Road" enthalten.

USE AdventureWorks2008R2;
GO
SELECT Name
FROM Production.Product
WHERE CONTAINS(Name, ' "Mountain" OR "Road" ')
GO

C. Verwenden von CONTAINS mit <prefix_term>

Im folgenden Beispiel werden alle Produktnamen zurückgegeben, die mindestens ein Wort enthalten, das mit dem Präfix chain in der Name-Spalte beginnt.

USE AdventureWorks2008R2;
GO
SELECT Name
FROM Production.Product
WHERE CONTAINS(Name, ' "Chain*" ');
GO

D. Verwenden von CONTAINS und OR mit <prefix_term>

Im folgenden Beispiel werden alle Kategoriebeschreibungen zurückgegeben, die Zeichenfolgen mit dem Präfix "chain" oder "full" enthalten.

USE AdventureWorks2008R2;
GO
SELECT Name
FROM Production.Product
WHERE CONTAINS(Name, '"chain*" OR "full*"');
GO

E. Verwenden von CONTAINS mit <proximity_term>

Im folgenden Beispiel werden alle Produktnamen zurückgegeben, die das Wort bike in der Nähe des Worts performance enthalten.

USE AdventureWorks2008R2;
GO
SELECT Description
FROM Production.ProductDescription
WHERE CONTAINS(Description, 'bike NEAR performance');
GO

F. Verwenden von CONTAINS mit <generation_term>

Im folgenden Beispiel wird nach allen Produkten mit Wörtern gesucht, die eine Form von ride sind: riding, ridden usw.

USE AdventureWorks2008R2;
GO
SELECT Description
FROM Production.ProductDescription
WHERE CONTAINS(Description, ' FORMSOF (INFLECTIONAL, ride) ');
GO

G. Verwenden von CONTAINS mit <weighted_term>

Im folgenden Beispiel wird nach allen Produktnamen gesucht, die die Wörter performance, comfortable oder smooth enthalten, wobei jedes Wort anders gewichtet wird.

USE AdventureWorks2008R2;
GO
SELECT Description
FROM Production.ProductDescription
WHERE CONTAINS(Description, 'ISABOUT (performance weight (.8), 
comfortable weight (.4), smooth weight (.2) )' );
GO

H. Verwenden von CONTAINS mit Variablen

Im folgenden Beispiel wird kein bestimmter Suchbegriff, sondern eine Variable verwendet.

USE AdventureWorks2008R2;
GO
DECLARE @SearchWord nvarchar(30)
SET @SearchWord = N'Performance'
SELECT Description 
FROM Production.ProductDescription 
WHERE CONTAINS(Description, @SearchWord);
GO

I. Verwenden von CONTAINS mit einem logischen Operator (AND)

Im folgenden Beispiel wird die ProductDescription-Tabelle der AdventureWorks2008R2-Datenbank verwendet. In der Abfrage wird das CONTAINS-Prädikat für die Suche nach Beschreibungen verwendet, deren Beschreibungs-ID ungleich 5 ist und die das Wort "Aluminum" und das Wort "spindle" enthalten. In der Suchbedingung wird der boolesche AND-Operator verwendet.

USE AdventureWorks2008R2;
GO
SELECT Description
FROM Production.ProductDescription
WHERE ProductDescriptionID <> 5 AND
   CONTAINS(Description, ' Aluminum AND spindle');
GO

J. Verwenden von CONTAINS, um eine Zeileneinfügung zu überprüfen

Im folgenden Beispiel wird CONTAINS in einer SELECT-Unterabfrage verwendet. Mithilfe der AdventureWorks2008R2-Datenbank ruft die Abfrage den Kommentarwert aller Kommentare in der ProductReview-Tabelle für einen bestimmten Zyklus ab. In der Suchbedingung wird der boolesche AND-Operator verwendet.

USE AdventureWorks2008R2;
GO
INSERT INTO Production.ProductReview 
(ProductID, ReviewerName, EmailAddress, Rating, Comments) 
VALUES
(780, 'John Smith', 'john@fourthcoffee.com', 5, 
'The Mountain-200 Silver from Adventure Works Cycles meets and exceeds expectations. I enjoyed the smooth ride down the roads of Redmond')
 
-- Given the full-text catalog for these tables is Adv_ft_ctlg, 
-- with change_tracking on so that the full-text indexes are updated automatically.
WAITFOR DELAY '00:00:30'   
-- Wait 30 seconds to make sure that the full-text index gets updated.
 
SELECT r.Comments, p.Name
FROM Production.ProductReview r
JOIN Production.Product p 
ON
 r.ProductID = p.ProductID
 
AND r.ProductID = (SELECT ProductID
                  FROM Production.ProductReview
                  WHERE CONTAINS (Comments, 
                                 ' Adventure Works AND 
                                   Redmond AND 
                                   "Mountain-200 Silver" '))

GO