CONTAINSTABLE (Transact-SQL)

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 solo 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 di una tabella indicizzata full-text. table può essere un nome di oggetto di database in una, due, tre o quattro parti. L'esecuzione della ricerca in una vista può interessare solo una tabella di base con indicizzazione full-text.

    table non può includere un nome di server e non può essere utilizzato per l'esecuzione di query su server collegati.

  • column_name
    Nome di una o più colonne indicizzate per la ricerca full-text. La colonna può essere di tipo char, varchar, nchar, nvarchar, text, ntext, image, xml, varbinary o varbinary(max).

  • 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 identica.

  • *
    Specifica che tutte le colonne indicizzate full-text in table devono essere utilizzate per la ricerca in base alle condizioni di ricerca specificate. Se non si specifica language_term, la lingua di tutte le colonne della tabella deve essere identica.

  • LANGUAGE language_term
    Lingua le cui risorse verranno utilizzate per il wordbreaking, lo stemming, il thesaurus e la rimozione di parole non significative come parte della query. Questo parametro è facoltativo e può essere specificato come valore stringa, intero o esadecimale corrispondente all'identificatore delle impostazioni locali (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 lingua full-text della colonna.

    Se documenti di lingue diverse vengono archiviati insieme come oggetti BLOB in una singola colonna, l'identificatore delle impostazioni locali (LCID) di un documento specifico determina la lingua da utilizzare per indicizzarne il contenuto. Se quando si esegue una query su una colonna di questo tipo si specifica LANGUAGElanguage_term, la probabilità di ottenere una corrispondenza pertinente sarà maggiore.

    Se l'argomento language_term viene specificato come stringa, corrisponde al valore della colonna alias nella vista di compatibilità sys.syslanguages. La stringa deve essere delimitata da virgolette singole, come in 'language_term'. Se specificato come valore intero, language_term corrisponde all'effettivo LCID che identifica la lingua. Se specificato come valore esadecimale, language_term è 0x seguito dal valore esadecimale dell'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), MicrosoftSQL 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 top_n_by_rank viene combinato con altri parametri, la query può restituire un numero minore di righe rispetto a quelle effettivamente corrispondenti a tutti i predicati. top_n_by_rank consente di migliorare le prestazioni delle query richiamando solo i risultati più significativi.

  • <contains_search_condition>
    Specifica il testo da cercare in column_name e le condizioni della ricerca. Per ulteriori informazioni sulle condizioni di ricerca, vedere CONTAINS (Transact-SQL).

Osservazioni

I predicati e le funzioni full-text possono essere utilizzati in una singola tabella, specificata in modo implicito nel predicato FROM. Per cercare in più tabelle, utilizzare una tabella unita in join nella clausola FROM, che consente di eseguire una ricerca in un set di risultati prodotto da due o più tabelle.

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.

CONTAINSTABLE non viene riconosciuto 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.

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.

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".

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.