CONTAINSTABLE (Transact-SQL)

Data aggiornamento: 17 luglio 2006

Restituisce una tabella contenente una o più righe o nessuna riga per le colonne che includono tipi di dati basati su caratteri per l'individuazione di corrispondenze più o meno esatte di singole parole e frasi, della prossimità delle parole a una certa distanza l'una dall'altra o di corrispondenze ponderate. È possibile fare riferimento alla funzione CONTAINSTABLE nella clausola FROM di un'istruzione SELECT come se fosse un normale nome di tabella.

Le query che utilizzano la funzione CONTAINSTABLE sono query full-text di tipo CONTAINS che restituiscono un valore di classificazione della pertinenza (RANK) e una chiave full-text (KEY) per ogni riga. La funzione CONTAINSTABLE utilizza le stesse condizioni di ricerca del predicato CONTAINS.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

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

Argomenti

  • table
    Nome della tabella contrassegnata per query full-text. table può essere un nome di oggetto di database in una, due, tre o quattro parti.
  • column_name
    Nome della colonna da includere nella ricerca appartenente a table. Le colonne di tipo char, varchar, nchar, nvarchar, text, ntext, image, xml, binary e varbinary sono colonne valide per la ricerca full-text.
  • column_list
    Indica che è possibile specificare più colonne, separate da virgola. column_list deve essere racchiuso tra parentesi. Se non si specifica language_term, la lingua di tutte le colonne in column_list deve essere la stessa.
  • *
    Specifica che tutte le colonne nella tabella registrate per la ricerca full-text devono essere utilizzate per la ricerca in base alle condizioni di ricerca specificate in CONTAINS. Se nella clausola FROM sono specificate più tabelle, è necessario qualificare il simbolo * con il nome della tabella. Se non si specifica language_term, la lingua di tutte le colonne della tabella deve essere la stessa.
  • LANGUAGE language_term
    Lingua le cui risorse verranno utilizzate per la sillabazione, l'analisi morfologica, il thesaurus e la rimozione di parole non significative come parte della query CONTAINS. Questo parametro è facoltativo e può essere specificato come valore stringa, intero o esadecimale corrispondente all'identificatore delle impostazioni internazionali (LCID) di una lingua. Se si specifica language_term, la lingua rappresentata dall'argomento verrà applicata a tutti gli elementi della condizione di ricerca. Se non si specifica alcun valore, verrà utilizzata la full-text language della colonna.

    Se l'argomento language_term viene specificato come stringa, corrisponde al valore della colonna alias nella tabella di sistema syslanguages. La stringa deve essere racchiusa tra virgolette singole, come in 'language_term'. Se l'argomento language_term viene specificato come valore integer, corrisponde all'effettivo LCID che identifica la lingua. Se si specifica un valore esadecimale, language_term è 0x seguito dal valore esadecimale di LCID. Il valore esadecimale non deve superare 8 cifre, compresi gli zero iniziali.

    Se il valore è nel formato DBCS (double-byte character set, set di caratteri a due byte), Microsoft SQL Server convertirà tale valore in Unicode.

    Se la lingua specificata non è valida oppure non vi sono risorse installate corrispondenti a tale lingua, SQL Server restituisce un errore. Per utilizzare le risorse della lingua neutra, specificare 0x0 per language_term.

  • top_n_by_rank
    Specifica che devono essere restituite solo le ncorrispondenze di pertinenza maggiore in ordine decrescente. Viene applicata solo quando viene specificato un valore n integer. Se si eseguono ulteriori operazioni di filtro, è possibile che vengano restituiti meno di n risultati.
  • <contains_search_condition>
    Specifica il testo da cercare nella colonna specificata da column_name e le condizioni della ricerca. Per ulteriori informazioni, vedere CONTAINS (Transact-SQL).

Osservazioni

La tabella restituita include una colonna KEY che contiene valori di chiave full-text. Ogni tabella indicizzata full-text include una colonna contenente valori univoci. I valori restituiti nella colonna KEY sono i valori chiave full-text delle righe che corrispondono ai criteri di ricerca specificati nel predicato CONTAINS. La proprietà TableFulltextKeyColumn, ottenuta con la funzione OBJECTPROPERTY, assegna l'identità a questa colonna di chiave univoca. Per ottenere l'ID della colonna associata alla chiave full-text dell'indice full-text, utilizzare sys.fulltext_indexes. Per ulteriori informazioni, vedere sys.fulltext_indexes (Transact-SQL).

Per ottenere le righe desiderate dalla tabella originale, specificare un join per le righe CONTAINSTABLE. La forma tipica della clausola FROM per un'istruzione SELECT che utilizza la funzione CONTAINSTABLE è la seguente:

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]

La tabella restituita dalla funzione CONTAINSTABLE include una colonna denominata RANK. Ogni riga della colonna RANK include un valore compreso tra 0 e 1.000 che indica il livello di corrispondenza tra una riga e i criteri di selezione. Questo valore di pertinenza viene normalmente utilizzato nell'istruzione SELECT in uno dei modi seguenti:

  • Nella clausola ORDER BY per ottenere le righe a cui sono stati assegnati i valori di pertinenza massimi nelle prime posizioni della tabella.
  • Nell'elenco di selezione per visualizzare il valore di pertinenza assegnato a ogni riga.

La funzione CONTAINSTABLE non viene riconosciuta come parola chiave se il livello di compatibilità è inferiore a 70. Per ulteriori informazioni, vedere sp_dbcmptlevel (Transact-SQL).

Autorizzazioni

Le autorizzazioni di esecuzione sono disponibili solo per gli utenti che dispongono dei privilegi appropriati per l'istruzione SELECT nella tabella o nelle colonne della tabella a cui viene fatto riferimento.

Esempi

A. Restituzione di valori di rango tramite la funzione CONTAINSTABLE

Nell'esempio seguente viene eseguita una ricerca dei nomi di prodotto che includono le parole breads, fish o beers. Ogni parola viene ponderata in modo diverso. Per ogni riga restituita corrispondente ai criteri di ricerca, viene illustrata la prossimità relativa (valore di rango assegnato) della corrispondenza. Le righe di rango superiore vengono restituite per prime.

[!NOTA] Per eseguire questo esempio, è necessario installare il database Northwind. Per informazioni sulle procedure di installazione del database Northwind, vedere Download dei database di esempio Northwind e pubs.

USE Northwind;
GO
SELECT FT_TBL.CategoryName, FT_TBL.Description, KEY_TBL.RANK
    FROM Categories AS FT_TBL 
        INNER JOIN CONTAINSTABLE(Categories, Description, 
        'ISABOUT (breads weight (.8), 
        fish weight (.4), beers weight (.2) )' ) AS KEY_TBL
            ON FT_TBL.CategoryID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC;
GO

B. Restituzione di valori di rango superiori al valore specificato tramite la funzione CONTAINSTABLE

Nell'esempio seguente vengono restituiti la descrizione e il nome di categoria di tutte le categorie di prodotti alimentari per cui la colonna Description include le parole "sweet and savory" accanto alla parola sauces o candies. Vengono ignorate tutte le righe che includono il nome di categoria Seafood. Vengono restituite solo le righe con valore di pertinenza maggiore o uguale a 2.

[!NOTA] Per eseguire questo esempio, è necessario installare il database Northwind. Per informazioni sulle procedure di installazione del database Northwind, vedere Download dei database di esempio Northwind e pubs.

USE Northwind;
GO
SELECT FT_TBL.Description, FT_TBL.CategoryName, KEY_TBL.RANK
FROM Categories AS FT_TBL 
    INNER JOIN CONTAINSTABLE (Categories, Description, 
        '("sweet and savory" NEAR sauces) OR
        ("sweet and savory" NEAR candies)'
        ) AS KEY_TBL
        ON FT_TBL.CategoryID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 2
    AND FT_TBL.CategoryName <> 'Seafood'
ORDER BY KEY_TBL.RANK DESC;
GO

C. Restituzione dei primi 10 valori con pertinenza maggiore utilizzando CONTAINSTABLE e top_n_by_rank

Nell'esempio seguente viene restituita la descrizione e il nome di categoria delle prime 10 categorie di prodotti alimentari per le quali la colonna Description include le parole "sweet and savory" accanto alla parola "sauces" o "candies".

[!NOTA] Per eseguire questo esempio, è necessario installare il database Northwind. Per informazioni sulle procedure di installazione del database Northwind, vedere Download dei database di esempio Northwind e pubs.

USE Northwind;
SELECT FT_TBL.Description, FT_TBL.CategoryName , KEY_TBL.RANK
FROM Categories AS FT_TBL 
    INNER JOIN CONTAINSTABLE (Categories, Description, 
        '("sweet and savory" NEAR sauces) OR
        ("sweet and savory" NEAR candies)', 10)
        AS KEY_TBL
        ON FT_TBL.CategoryID = KEY_TBL.[KEY]

GO

D. Utilizzo dell'argomento LANGUAGE

Nell'esempio seguente viene illustrato l'utilizzo dell'argomento LANGUAGE.

USE Northwind;

SELECT FT_TBL.Description , FT_TBL.CategoryName , KEY_TBL.RANK

FROM dbo.Categories AS FT_TBL

INNER JOIN CONTAINSTABLE (dbo.Categories, Description,

'("sweet and savory" NEAR sauces) OR

("sweet and savory" NEAR candies)',LANGUAGE N'English', 10)

AS KEY_TBL

ON FT_TBL.CategoryID = KEY_TBL.[KEY];

[!NOTA] L'argomento LANGUAGE language_term non è obbligatorioper l'utilizzo del parametro top_n_by_rank .

Vedere anche

Riferimento

CONTAINS (Transact-SQL)
Funzioni per i set di righe (Transact-SQL)
SELECT (Transact-SQL)
WHERE (Transact-SQL)

Altre risorse

Esecuzione di query su SQL Server tramite la ricerca full-text

Guida in linea e informazioni

Assistenza su SQL Server 2005

Cronologia modifiche

Versione Cronologia

17 luglio 2006

Nuovo contenuto:
  • Aggiunta dell'esempio relativo all'argomento LANGUAGE.