CONTAINS (Transact-SQL)

Aktualisiert: 14. April 2006

Dieses Prädikat wird zum Durchsuchen von Spalten verwendet, die zeichenbasierte Datentypen enthalten, um präzise oder weniger genaue (fuzzy) Treffer von einzelnen Wörtern und Ausdrücken zu erhalten, Wortverwandtschaften innerhalb bestimmter Grenzen festzustellen oder gewichtete Treffer zu erzielen.

Sie können in SQL Server 2005 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 Wortes 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 bei Verwendung des Thesaurus (das Wort Metall kann z. B. über die Synonyme Aluminium und Stahl verfügen).

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 der Spalte oder Spalten, die im Volltextindex enthalten sind. Spalten vom Typ char, varchar, nchar, nvarchar, text, ntext, image, xml und varbinary(max) 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. Die Spalten in der CONTAINS-Klausel müssen aus einer Tabelle stammen. 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, in der der Benutzer die Abfrage ausgibt. Falls die Spalte mehrere als BLOBs (Binary Large Objects) gespeicherte Dokumente enthält, wird die zum Indizieren des Dokumentinhalts verwendete Sprache vom Gebietsschemabezeichner (Locale Identifier, LCID) des Dokuments bestimmt. Eine Spalte kann demzufolge Daten in mehreren Sprachen speichern. Mit dem LANGUAGE-Parameter können Benutzer die Sprache angeben, in der sie suchen. Auf diese Weise kann die Wahrscheinlichkeit einer guten Übereinstimmung erhöht 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 eingeschlossen werden, wie z. B. 'language_term'. In Form einer ganzen Zahl ist language_term der eigentliche Gebietsschemabezeichner, der die Sprache angibt. 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 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 AdventureWorks;
    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. Im Beispiel sollten Sie somit @SearchWord als nvarchar(30) deklarieren.

    USE AdventureWorks;
    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.

    ms187787.note(de-de,SQL.90).gifHinweis:
    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 werden nur dann in der Datenbank gefunden, wenn sie unter <contains_search_condition> in der gleichen Reihenfolge angegeben werden. Bei der Suche nach Zeichen in einem Wort oder einem Ausdruck wird nicht zwischen Groß- und Kleinschreibung unterschieden. Füllwörter wie z. B. a, 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.

    Ist <prefix_term> ein Ausdruck, wird jedes Wort, das in dem Ausdruck vorhanden ist, 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 Wortes 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 mit der Spaltensprache der abgefragten Spalte verwiesen. Falls language_term angegeben ist, wird die dieser Sprache entsprechende Wortstammerkennung verwendet.

    Ein angegebener <simple_term>-Wert innerhalb von <generation_term> kann nicht sowohl mit Substantiven als auch mit Verben ü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. Falls für den ganzen Ausdruck oder für Teile von simple_term keine Übereinstimmung gefunden wird, wird der nicht übereinstimmende Teil als simple_term behandelt. Weitere Informationen zum Thesaurus der Volltextsuche finden Sie unter Thesaurus.
  • <proximity_term>
    Gibt eine Suche nach Wörtern oder Ausdrücken an, die nahe beieinander stehen müssen. <proximity_term> gleicht dem AND-Operator: Bei beiden wird vorausgesetzt, dass in der zu durchsuchenden Spalte mehr als ein Wort bzw. Ausdruck vorhanden ist. Je näher die Wörter in <proximity_term> beieinander stehen, desto höher ist der Übereinstimmungsgrad.

    • NEAR | ~
      Gibt an, dass sich das Wort oder der Ausdruck auf der linken Seite des NEAR- oder ~-Operators in der Nähe des Wortes bzw. Ausdrucks auf der rechten Seite des Operators befinden soll. Mehrere solcher Ausdrücke, die nahe beieinander stehen sollen, können verkettet werden. Beispiel:

      a NEAR b NEAR c 
      

      Dies bedeutet, dass das Wort oder der Ausdruck a in der Nähe des Wortes bzw. des Ausdrucks b stehen soll, der sich wiederum in der Nähe des Wortes oder Ausdrucks c befinden soll. Wenn mehrere Ausdrücke, die nahe beieinander stehen sollen, verkettet sind, müssen sich alle Ausdrücke, die nahe beieinander stehen sollen, in der Nähe befinden. Im Beispiel a ~ b ~ c müsste das Wort oder der Ausdruck a auch in der Nähe des Wortes oder Ausdrucks c stehen.

  • <weighted_term>
    Gibt an, dass die übereinstimmenden Zeilen (die von der Abfrage zurückgegeben werden) mit einer Liste von Wörtern und Ausdrücken mit optional gewichteten Werten übereinstimmen.
  • ISABOUT
    Schlüsselwort, das eine gewichtete Suche für <weighted_term> anzeigt.

    • WEIGHT(weight_value)
      Gibt einen Gewichtungswert von 0.0 bis 1.0 an. Für jede Komponente in <weighted_term> kann ein weight_value angegeben werden. Mit weight_value kann bestimmt werden, wie verschiedene Teilabfragen die Rangfolge der als Treffer gewerteten Zeilen beeinflussen. WEIGHT hat keinen Einfluss auf das Ergebnis von CONTAINS-Abfragen, von WEIGHT wird jedoch der Rang in CONTAINSTABLE-Abfragen beeinflusst. Weitere Informationen finden Sie unter CONTAINSTABLE (Transact-SQL).

      ms187787.note(de-de,SQL.90).gifHinweis:
      Das Dezimaltrennzeichen ist immer ein Punkt, unabhängig vom Gebietsschema des Betriebssystems.
  • { 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üsselwortes 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üsselwortes 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üsselwortes zur Darstellung des OR-Operators verwendet werden.

      Sind in <contains_search_condition> in Klammern gesetzte Gruppen enthalten, 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, spielt deren Reihenfolge keine Rolle.
      • n
        Ein Platzhalter, der anzeigt, dass mehrere geschachtelte CONTAINS-Suchbedingungen und Begriffe angegeben werden können.

Hinweise

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

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 AdventureWorks;
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 AdventureWorks;
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 AdventureWorks;
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 AdventureWorks;
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 Wortes performance enthalten.

USE AdventureWorks;
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 AdventureWorks;
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 AdventureWorks;
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 Suchausdruck, sondern eine Variable verwendet.

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

Siehe auch

Verweis

CONTAINSTABLE (Transact-SQL)
FREETEXT (Transact-SQL)
FREETEXTTABLE (Transact-SQL)
WHERE (Transact-SQL)

Andere Ressourcen

Volltextsuche
Volltextabfragen

Hilfe und Informationen

Informationsquellen für SQL Server 2005

Änderungsverlauf

Version Verlauf

14. April 2006

Neuer Inhalt:
  • Informationen zum Vermeiden der Konvertierung von contains_search_condition-Werten wurden hinzugefügt.

15. September 2007

Neuer Inhalt:
  • Es wurde ein Hinweis zum Dezimaltrennzeichen für die ISABOUT-Definition hinzugefügt.