Ein CONTAINS- oder FREETEXT-Prädikat für eine Tabelle oder eine indizierte Ansicht kann nicht verwendet werden, da es nicht im Volltext indiziert ist

95

In meiner SQL Server 2008 R2-Datenbank wird der folgende Fehler angezeigt:

Ein CONTAINSoder FREETEXTPrädikat für die Tabelle oder die indizierte Ansicht 'tblArmy' kann nicht verwendet werden , da sie nicht im Volltext indiziert ist.

DotnetSparrow
quelle
1
Haben Sie tatsächlich einen Volltextkatalog erstellt?
Alex K.

Antworten:

111
  1. Stellen Sie sicher, dass die Volltextsuchfunktion installiert ist.

    Einrichtung der Volltextsuche

  2. Erstellen Sie einen Volltextsuchkatalog.

     use AdventureWorks
     create fulltext catalog FullTextCatalog as default
    
     select *
     from sys.fulltext_catalogs
    
  3. Erstellen Sie einen Volltextsuchindex.

     create fulltext index on Production.ProductDescription(Description)
     key index PK_ProductDescription_ProductDescriptionID
    

    Stellen Sie vor dem Erstellen des Index Folgendes sicher:
    - Sie haben noch keinen Volltextsuchindex für die Tabelle, da nur ein Volltextsuchindex für eine Tabelle zulässig ist.
    - Für die Tabelle ist ein eindeutiger Index vorhanden. Der Index muss auf einer Einzelschlüsselspalte basieren, die NULL nicht zulässt.
    - Volltextkatalog existiert. Sie müssen den Volltextkatalognamen explizit angeben, wenn kein Standardvolltextkatalog vorhanden ist.

Sie können die Schritte 2 und 3 in SQL Server Management Studio ausführen. Klicken Sie im Objekt-Explorer mit der rechten Maustaste auf eine Tabelle, wählen Sie den Full-Text indexMenüpunkt und dann den Define Full-Text Index...Untermenüpunkt. Der Volltext-Indizierungsassistent führt Sie durch den Vorgang. Außerdem wird ein Volltextsuchkatalog für Sie erstellt, falls Sie noch keinen haben.

Geben Sie hier die Bildbeschreibung ein

Weitere Informationen finden Sie bei MSDN

Alex Aza
quelle
Gute Informationen Alex! HINWEIS: Für Benutzer von Azure SQL wird die Tabelle "Enthält" derzeit nicht unterstützt. Siehe hier: msdn.microsoft.com/library/azure/ee336253.aspx
Termato
Wenn Sie erweiterte SQL Express-Dienste verwenden, können Sie hier einen Volltextindex erstellen: stackoverflow.com/questions/10407337/…
Termato
69

Eine Problemumgehung für CONTAINS: Wenn Sie keinen Volltextindex für die Spalte erstellen möchten und die Leistung nicht zu Ihren Prioritäten gehört, können Sie die LIKEAnweisung verwenden, für die keine vorherige Konfiguration erforderlich ist:

Beispiel: Finden Sie alle Produkte, die den Buchstaben Q enthalten:

SELECT ID, ProductName
FROM [ProductsDB].[dbo].[Products]
WHERE [ProductsDB].[dbo].[Products].ProductName LIKE '%Q%'
Mohammad Sepahvand
quelle
1
Link . LIKE Transact-SQL-Prädikat funktioniert nur mit Zeichenmustern. Sie können das LIKE-Prädikat auch nicht zum Abfragen formatierter Binärdaten verwenden. Darüber hinaus ist eine LIKE-Abfrage für eine große Menge unstrukturierter Textdaten viel langsamer als eine entsprechende Volltextabfrage für dieselben Daten.
Manolis
1
Ah, Süße ... die einfache Art und Weise, bei der Sie Ihren Installer nicht ausgraben und mit Ihren Umgebungseinstellungen herumspielen müssen. Gut gemacht!
Christine
21

Sie müssen Full-Text-Indexfür alle Tabellen in der Datenbank definieren, wo Sie eine Abfrage verwenden müssen, die einige Zeit in Anspruch CONTAINSnehmen wird.

Stattdessen können Sie das verwenden LIKE, mit dem Sie sofort Ergebnisse erzielen, ohne die Einstellungen für die Tabellen anpassen zu müssen.

Beispiel:

SELECT * FROM ChartOfAccounts WHERE AccountName LIKE '%Tax%'

Das gleiche Ergebnis CONTAINSkann mit erzielt werden LIKE.

siehe das Ergebnis: Geben Sie hier die Bildbeschreibung ein

Ashraf Abusada
quelle
Das ist wirklich klug
WonderWorker
6
Dies ist ein schöner Trick, aber die Art und Weise, wie diese Antwort formuliert wird, ist falsch. Verwenden Sie es nicht "nur". Dies hat einige schwerwiegende Auswirkungen auf die Leistung, und jeder, der dies in ein Produktionssystem einfügt, sollte sehr sorgfältig darüber nachdenken, vollständige Tabellenscans wie diese für eine nicht indizierte Spalte durchzuführen.
Caesay
3

Möglicherweise müssen Sie die Tabelle für die Volltextindizierung aktivieren .

mellamokb
quelle
Aktivieren / Deaktivieren Die Volltextsuche ist im Kontextmenü abgeblendet. Ich denke, ich muss die Volltextsuche installieren. Wie kann ich die Volltextsuche installieren?
DotnetSparrow
Führen Sie die Installation für SQL Server aus, und es sollte eine Option zum Ändern installierter Komponenten (oder ähnliches) geben. Klicken Sie darauf und aktivieren Sie das Kontrollkästchen Volltext zum richtigen Zeitpunkt, und Sie sollten gut sein. Entschuldigung, ich habe keine zur Hand oder ich würde spezifischere Anweisungen geben.
Tom H
@ Hi Tom: Beim Ausführen des SQL Server 2008 R2-Installationsprogramms wurde keine Option zum Hinzufügen von Funktionen angezeigt.
DotnetSparrow
1

Sie müssen einen Volltextindex für bestimmte Felder hinzufügen, die Sie durchsuchen möchten.

ALTER TABLE news ADD FULLTEXT(headline, story);

Dabei sind "Nachrichten" Ihre Tabelle und die Felder "Überschrift, Geschichte", die Sie für die Volltextsuche nicht aktivieren

SimonQuest
quelle
1

Es gibt noch eine weitere Lösung, um die Spalte Volltext auf true zu setzen.

Diese Lösung hat zum Beispiel bei mir nicht funktioniert

ALTER TABLE news ADD FULLTEXT(headline, story);

Meine Lösung.

  1. Klicken Sie mit der rechten Maustaste auf die Tabelle
  2. Design
  3. Klicken Sie mit der rechten Maustaste auf die Spalte, die Sie bearbeiten möchten
  4. Volltextindex
  5. Hinzufügen
  6. Schließen
  7. Aktualisierung

NÄCHSTE SCHRITTE

  1. Klicken Sie mit der rechten Maustaste auf die Tabelle
  2. Design
  3. Klicken Sie auf die Spalte, die Sie bearbeiten möchten
  4. Am unteren Rand von mssql befindet sich die Registerkarte "Spalteneigenschaften".
  5. Volltextspezifikation -> (Ist Volltext indiziert) auf true gesetzt.

Aktualisierung

Version von mssql 2014

Icet
quelle
-1
Select * from table
where CONTAINS([Column], '"A00*"')  

wird als% gleich wie handeln

where [Column] Like 'A00%'
Dnyanesh Mijagiri
quelle