分享方式:


PolyBase Transact-SQL 參考

適用於:SQL Server

本文會針對各種外部資料來源,查看使用 PolyBase 就地查詢外部資料的選項,稱為資料虛擬化。

PolyBase 中使用的 T-SQL 語法

若要使用 PolyBase,您必須建立外部表格來參考您的外部資料。 請參閱:

注意

若要使用 PolyBase,您必須在資料庫上具有系統管理員或 CONTROL SERVER 層級權限。

教學課程

如需查詢的範例,請參閱 PolyBase Queries(PolyBase 查詢)。

如需各種外部資料來源的更多教學課程,請參閱:

檔案中繼資料函式

有時可能需要知道哪些檔案或資料夾來源與結果集中特定的資料列相互關聯。

您可以使用函式 filepathfilename 傳回結果集中的檔案名稱和/或路徑。 或是用以根據檔案名稱和/或資料夾路徑來篩選資料。 在下列各節中,您會在範例中找到簡短描述。

Filename 函式

此函式會傳回資料列來源的檔案名稱。

傳回資料類型為 nvarchar(1024)。 為了達到最佳效能,請一律將 filename 函式的結果轉換成適當的資料類型。 如果您使用字元資料類型,請務必確認長度適當。

下列範例會讀取 2017 年最後三個月的 NYC Yellow Taxi 資料檔案,並傳回每個檔案的乘車次數。 查詢的 OPENROWSET 部分會指定要讀取哪一個檔案。

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();

下列範例會示範如何在 WHERE 子句中使用 filename() 來篩選要讀取的檔案。 它會存取查詢中 OPENROWSET 部分的整個資料夾,並篩選 WHERE 子句中的檔案。

您的結果會與先前的範例相同。

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 函式

此函式會傳回完整路徑或部分路徑的:

  • 若在沒有參數的情況下進行呼叫,會傳回資料列來源的完整檔案路徑。
  • 若以參數進行呼叫,則會傳回路徑的一部分,該部分會與參數中所指定位置上的萬用字元相符。 例如,參數值 1 會傳回符合第一個萬用字元的路徑部分。

傳回資料類型為 nvarchar(1024)。 為了達到最佳效能,請一律將 filepath 函式的結果轉換成適當的資料類型。 如果您使用字元資料類型,請務必確認長度適當。

下列範例會讀取 2017 年最後三個月的 NYC Yellow Taxi 資料檔案, 並傳回每個檔案路徑的乘車次數。 查詢的 OPENROWSET 部分會指定要讀取哪一個檔案。

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;

下列範例會示範如何在 WHERE 子句中使用 filepath() 來篩選要讀取的檔案。

您可以在查詢的 OPENROWSET 部分中使用萬用字元,並在 WHERE 子句中篩選檔案。 您的結果會與先前的範例相同。

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;