Condividi tramite


Usare i metadati dei file nelle query del pool SQL serverless

Questo articolo illustra come eseguire query su file o cartelle specifici usando i metadati. Il pool SQL serverless può gestire più file e cartelle. Per altre informazioni, vedere Eseguire query su cartelle e più file.

In alcuni casi, potrebbe essere necessario sapere quale origine file o cartella correla a una riga specifica in un set di risultati. È possibile usare le funzioni filepath e filename per restituire nomi di file e/o il percorso nel set di risultati oppure usarli per filtrare i dati in base al nome file o al percorso della cartella. Queste funzioni sono descritte in funzione filename e funzione filepath.

Le sezioni seguenti forniscono brevi descrizioni ed esempi di codice.

Prerequisiti

Il primo passaggio consiste nel creare un database con un'origine dati che fa riferimento a un account di archiviazione. Inizializzare quindi gli oggetti eseguendo uno script di installazione in tale database. Questo script di installazione crea le origini dati, le credenziali con ambito database e i formati di file esterni usati in questi esempi.

Funzioni

Filename

La filename funzione restituisce il nome del file da cui ha origine la riga.

L'esempio seguente legge i file di dati nyc Yellow Taxi per settembre 2017 e restituisce il numero di corse per file. La OPENROWSET parte della query specifica i file letti.

SELECT
    nyc.filename() AS [filename]
    ,COUNT_BIG(*) AS [rows]
FROM  
    OPENROWSET(
        BULK 'parquet/taxi/year=2017/month=9/*.parquet',
        DATA_SOURCE = 'SqlOnDemandDemo',
        FORMAT='PARQUET'
    ) nyc
GROUP BY nyc.filename();

L'esempio seguente mostra come usare filename() nella clausola WHERE per filtrare i file da leggere. Accede all'intera cartella nella parte OPENROWSET della query e filtra i file nella clausola WHERE.

I risultati saranno identici a quelli dell'esempio precedente.

SELECT
    r.filename() AS [filename]
    ,COUNT_BIG(*) AS [rows]
FROM OPENROWSET(
    BULK 'csv/taxi/yellow_tripdata_2017-*.csv',
        DATA_SOURCE = 'SqlOnDemandDemo',
        FORMAT = 'CSV',
        PARSER_VERSION = '2.0',
        FIRSTROW = 2) 
        WITH (C1 varchar(200) ) AS [r]
WHERE
    r.filename() IN ('yellow_tripdata_2017-10.csv', 'yellow_tripdata_2017-11.csv', 'yellow_tripdata_2017-12.csv')
GROUP BY
    r.filename()
ORDER BY
    [filename];

Filepath

La filepath funzione restituisce un percorso completo o parziale:

  • Quando viene chiamato senza un parametro, restituisce il percorso completo del file da cui ha origine la riga. Quando DATA_SOURCE viene usato in OPENROWSET, restituisce il percorso relativo a DATA_SOURCE.
  • Se viene chiamata con un parametro, viene restituita una parte del percorso che corrisponde al carattere jolly nella posizione specificata nel parametro. Ad esempio, il valore del parametro 1 restituisce parte del percorso che corrisponde al primo carattere jolly.

L'esempio seguente legge i file di dati nyc Yellow Taxi per gli ultimi tre mesi del 2017. Restituisce il numero di corse per ogni percorso file. La OPENROWSET parte della query specifica i file letti.

SELECT
    r.filepath() AS filepath
    ,COUNT_BIG(*) AS [rows]
FROM OPENROWSET(
        BULK 'csv/taxi/yellow_tripdata_2017-1*.csv',
        DATA_SOURCE = 'SqlOnDemandDemo',
        FORMAT = 'CSV',
        PARSER_VERSION = '2.0',
        FIRSTROW = 2
    )
    WITH (
        vendor_id INT
    ) AS [r]
GROUP BY
    r.filepath()
ORDER BY
    filepath;

L'esempio seguente mostra come usare filepath() nella clausola WHERE per filtrare i file da leggere.

È possibile usare i caratteri jolly nella parte OPENROWSET della query e filtrare i file nella clausola WHERE. I risultati saranno identici a quelli dell'esempio precedente.

SELECT
    r.filepath() AS filepath
    ,r.filepath(1) AS [year]
    ,r.filepath(2) AS [month]
    ,COUNT_BIG(*) AS [rows]
FROM OPENROWSET(
        BULK 'csv/taxi/yellow_tripdata_*-*.csv',
        DATA_SOURCE = 'SqlOnDemandDemo',
        FORMAT = 'CSV',
        PARSER_VERSION = '2.0',        
        FIRSTROW = 2
    )
WITH (
    vendor_id INT
) AS [r]
WHERE
    r.filepath(1) IN ('2017')
    AND r.filepath(2) IN ('10', '11', '12')
GROUP BY
    r.filepath()
    ,r.filepath(1)
    ,r.filepath(2)
ORDER BY
    filepath;

Passaggio successivo