共用方式為


使用 PolyBase 連接、查詢及匯出資料

適用於: SQL Server 2016 (13.x)及以後版本 Azure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric 中的 SQL 資料庫

資料虛擬化 讓你能對外部資料執行 Transact-SQL(T-SQL)查詢,而不必將資料載入資料庫。 PolyBase 是資料庫引擎功能,能在 SQL Server 與 Azure SQL 上實現資料虛擬化。 你定義一個外部資料來源、可選的檔案格式和外部資料表,然後像其他資料表一樣查詢 SELECT 外部資料表。

本指南能幫助你:

  • 了解你的 SQL 平台和版本支援哪些 PolyBase 功能。
  • 在查詢或匯入資料時,選擇 OPENROWSET、 外部資料表 和 BULK INSERT
  • 請參考逐步連結了解常見情境。
  • 檢視效能、故障排除及生產工作負載的最佳實務。

常見使用案例

下表描述了可能的使用情境。

情境 使用
即時檔案探索 OPENROWSET(BULK ...)
可重複使用的檔案查詢用於 BI/報告 檔案上的外部資料表
跨資料庫查詢 (SQL Server、Oracle、Teradata、MongoDB、ODBC) 帶有外部表格的 PolyBase 連接器
將查詢結果匯出為檔案 CREATE EXTERNAL TABLE AS SELECT (CETAS)
大量資料匯入表格 BULK INSERTOPENROWSET(BULK ...)INSERT ... SELECT

哪些功能在哪裡可用?

下表顯示各 SQL 平台上可使用哪些 PolyBase 及資料虛擬化核心功能。 在使用詳細指南之前,請先用這張表格來判斷你能在平台上做什麼。

Feature SQL Server 2019 SQL Server 2022 SQL Server 2025 Azure SQL Database Azure SQL 受控執行個體 Microsoft Fabric 中的 SQL 資料庫
外部數據表 是的 是的 是的 是的 是的 是的
OPENROWSET(BULK) 1 是的 是的 是的 是的 是的
CETAS (出口) No 是的 是的 No 是的 No
CSV / 分隔檔案 2 是的 是的 是的 是的 是的
Parquet 檔案 No 是的 是的 是的 是的 是的
三角洲湖表 No 是的 是的 No No No
連接到另一個 SQL Server。 是的 是的 是的 No No No
連接到 Azure SQL Database 或 Azure SQL Managed Instance 3 3 3 No No No
連接 Oracle / Teradata / MongoDB 是的 是的 是的 No No No
連線至 Azure Blob 儲存體 是的 是的 是的 是的 是的 No
連接 ADLS Gen2 No 是的 是的 是的 是的 No
連接相容 S3 儲存裝置 No 是的 是的 No No No
連接 OneLake(Fabric) No No No No No 是的
下推計算 是的 是的 是的 No No No
受控識別驗證 No No 4 是的 是的 No

1 SQL Server 2019(15.x)支援 OPENROWSET(BULK...) 本地與網路檔案路徑。 在 SQL Server 2022(16.x)及更新版本中, OPENROWSET(BULK...) 也支援從雲端儲存讀取,包含 FORMAT = 'PARQUET'FORMAT = DELTAFORMAT = 'CSV'和 。

SQL Server 2019(15.x)中 2 CSV 支援曾需 Hadoop。 在 SQL Server 2022(16.x)及之後版本中,CSV 原生支援,無需 Hadoop。

3 使用 SQL Server 連接器(sqlserver://)。 資料庫範圍的憑證針對 Azure SQL 端點,步驟與連接另一台 SQL Server 相同。

4 支援管理身份驗證以連接 Azure Blob Storage(ABS)及 ADLS Gen2。 這需要使用 Azure Arc 啟用的 SQL Server 或是在 Azure VM 上運行的 SQL Server,以管理本地的 SQL Server。 它原生支援 Azure SQL 資料庫和 Azure SQL 管理實例。

備註

自 SQL Server 2025(17.x)起,查詢 Azure Blob Storage、ADLS Gen2 或相容 S3 儲存裝置的資料檔案(CSV、Parquet 與 Delta)已成為原生引擎功能,不再需要安裝或執行 PolyBase 服務。 RDBMS 連接器(SQL Server、Oracle、Teradata、MongoDB、ODBC)仍需安裝並執行 PolyBase 服務。 SQL Server 2025(17.x)也新增了這些連接器的 Linux 支援,這些連接器過去僅在 Windows 上提供。

查詢外部資料

在選擇特定情境前,先了解查詢外部資料的三種方式:

方法 語法 何時使用 驗證 需要 PolyBase
OLE DB 臨時查詢 OPENROWSET(provider, connection, query) 你想要一個快速且一次性且不需持久物件的查詢,或是需要 Microsoft Entra ID 認證 SQL 認證、Windows 認證、Microsoft Entra ID (MSOLEDBSQL) No
檔案臨時查詢 OPENROWSET(BULK ...) 你想快速探索檔案資料或測試結構,再建立表格 SAS 令牌、存取金鑰、管理身份、Microsoft Entra ID 是適用於 Azure SQL Database 和 Azure SQL Managed Instance

SQL Server 實例則不行
持久資料連接器 CREATE EXTERNAL TABLE 搭配 sqlserver://oracle://teradata://等。 你需要持續存取、治理、統計和推下運算來進行生產 僅限 SQL 驗證 是的

在 SQL Server 2019(15.x)和 SQL Server 2022(16.x)中,雲端檔案存取是必須使用 PolyBase 服務的。 SQL Server 2025(17.x)及後續版本原生支援 CSV、Parquet 與 Delta,無需 PolyBase。

決策指南

情境 建議
我需要 Microsoft Entra ID 驗證來進行遠端 SQL,或是想避免 PolyBase 服務 使用 OPENROWSET(MSOLEDBSQL, ...) (臨時使用,無持久物件)
我需要持久的表格、統計數據,或是遠端資料庫的下推計算 使用CREATE EXTERNAL TABLE 配合 PolyBase 連接器(sqlserver://oracle://teradata://mongodb://odbc://)。 OPENROWSET 支援連接器
我正在探索一個新檔案或測試一個結構 使用 OPENROWSET(BULK ...) (快速迭代,無持久物件)
我正在將檔案資料匯入一個帶有轉換的表格 請使用INSERT ... SELECTOPENROWSET(BULK ...)
我需要治理或共享存取權,讓許多使用者或應用程式都能使用。 使用 CREATE EXTERNAL TABLE 讓權限和元資料集中化
我正在用 Fabric 的 SQL 資料庫工作 OPENROWSET(BULK ...) 用於臨時的 OneLake 查詢或外部資料表以進行可重用的存取;對於外部儲存空間,請使用 OneLake 的捷徑設定以便存取。

選擇你的情境

現在你已經了解這三種方法,請參考以下指南之一來實作你的特定使用情境。

查詢檔案(Parquet、CSV 或 Delta)

如果你的資料在 Azure Blob Storage、ADLS Gen2、S3 相容儲存或 OneLake 上的 Parquet、CSV 或 Delta 檔案中,請遵循以下指南之一:

情境 推薦指南 平台
對 Parquet 或 CSV 檔案進行快速臨時查詢 請使用 OPENROWSET。 不需要外部表格 SQL Server 2022 (16.x) 及以後版本、Azure SQL 資料庫、Azure SQL Managed Instance、Fabric 中的 SQL 資料庫
對具有持久結構的 Parquet 檔案重複查詢 在 Parquet 上建立外部資料表 SQL Server 2022 (16.x) 及以後版本、Azure SQL 資料庫、Azure SQL Managed Instance、Fabric 中的 SQL 資料庫
查詢帶有外部資料表的 CSV 檔案 建立一個帶有分隔文字檔案格式的外部表格 SQL Server 2019 (15.x) 及後版本,Azure SQL Database、Azure SQL Managed Instance、SQL database in Fabric
查詢三角洲湖表格 建立一個帶有 FILE_FORMAT = DeltaLakeFileFormat 的外部表格 SQL Server 2022 (16.x) 及更新版本
將查詢結果匯出 為 Parquet 或 CSV 檔案(CETAS) 使用 CREATE EXTERNAL TABLE AS SELECT SQL Server 2022 (16.x) 及以後版本,Azure SQL Managed Instance

你也可以跟隨以下步驟教學:

Tutorial 說明
開始使用 SQL Server 2022 中的 PolyBase 包含 OPENROWSET、Parquet 和 CSV、外部表格以及資料夾瀏覽。
使用 PolyBase 將 S3 相容物件儲存體中的 parquet 檔案虛擬化 SQL Server 2022(16.x)及後續版本的教學。
用 PolyBase 虛擬化 CSV 檔案 SQL Server 2022(16.x)及後續版本的教學。
用 PolyBase 虛擬化 delta 表 SQL Server 2022(16.x)及後續版本的教學。
使用 Azure SQL 資料庫的資料虛擬化 (預覽版) Azure SQL 數據庫 Parquet 和 CSV 使用指南
使用 Azure SQL 受控執行個體的資料虛擬化 Azure SQL Managed Instance 指南,適用於 Parquet、CSV 和 CETAS。
Fabric 中 SQL 資料庫中的資料虛擬化 Fabric 指南中有關 OneLake 檔案的 SQL 資料庫。

連接另一個 SQL Server 實例、Azure SQL 資料庫或 SQL 受管理實例

在 SQL Server 2019(15.x)及後續版本中,PolyBase 可查詢其他 SQL Server 實例、Azure SQL 資料庫或 Azure SQL 管理實例的資料表,無需連結伺服器。

這很重要

sqlserver://連接器在 Fabric 的 SQL 資料庫中不被支援。 PolyBase RDBMS 連接器透過 SQL 認證 CREATE DATABASE SCOPED CREDENTIAL ,且不支援 Microsoft Entra ID、管理身份或服務主體認證。 因為 Fabric 中的 SQL 資料庫需要 Microsoft Entra 認證,你無法用 PolyBase 連接它。

Step 怎麼辦?
1. 安裝 PolyBase 在 Windows 上安裝 PolyBase ,或在 Linux 上安裝 PolyBase
2. 建立憑證 CREATE DATABASE SCOPED CREDENTIAL 使用目標帳號登入
3. 建立外部資料來源 CREATE EXTERNAL DATA SOURCE ... WITH (LOCATION = 'sqlserver://<server>')
4. 建立外部表格 CREATE EXTERNAL TABLE ... WITH (LOCATION = '<db>.<schema>.<table>')
5. 查詢 SELECT * FROM <external_table>

小提示

SQL Server 連接器sqlserver://()也適用於 Azure SQL 資料庫和 Azure SQL Managed Instance。 使用相同的步驟,並設定 LOCATION 為 Azure SQL 端點(例如, sqlserver://myserver.database.windows.net)。

詳細指南請參閱 「配置 PolyBase 以存取 SQL Server 中的外部資料」。

連接 Oracle、Teradata 或 MongoDB

SQL Server 2019(15.x)及後續版本可透過 PolyBase ODBC 連接器查詢 Oracle、Teradata、MongoDB 及 Cosmos DB。

數據源 Guide 要求
Oracle 設定 PolyBase 存取 Oracle 中的外部資料 SQL Server 2019(15.x)及後續版本,Oracle 用戶端驅動程式
Teradata 設定 PolyBase 存取 Teradata 中的外部資料 SQL Server 2019(15.x)及後續版本,Teradata ODBC 驅動程式
MongoDB / Cosmos 資料庫 設定 PolyBase 存取 MongoDB 中的外部資料 SQL Server 2019(15.x)及後續版本,MongoDB ODBC 驅動程式
任何 ODBC 來源 設定 PolyBase 以存取具有 ODBC 泛型型別的外部資料 SQL Server 2019(15.x)及更新版本(Windows)

(Linux 從 SQL Server 2025 (17.x) 開始)

連接至 Azure Blob 儲存或 ADLS Gen2

SQL 平台 驗證選項 Guide
SQL Server 2022 (16.x) 及更新版本 SAS 憑證、存取金鑰、管理身份(自 SQL Server 2025 (17.x)起) 配置 PolyBase 以存取 Azure Blob Storage 中的外部資料
SQL Server 2019 (15.x) 存取金鑰(透過 Hadoop 連接器) 配置 PolyBase 以存取 Azure Blob Storage 中的外部資料
Azure SQL Database SAS token、Managed Identity、Microsoft Entra pass-through 使用 Azure SQL 資料庫的資料虛擬化 (預覽版)
Azure SQL 受控執行個體 SAS 代幣,管理身份 使用 Azure SQL 受控執行個體的資料虛擬化

在 SQL Server 2022(16.x)中,URI 前綴有所更改。 從 SQL Server 2019(15.x)或更早版本遷移時:

  • Azure Blob Storage: change wasb[s]:// to abs://
  • ADLS 第二代:變更 abfs[s]://adls://

欲了解更多資訊,請參閱 「配置 PolyBase 以存取 Azure Blob 儲存中的外部資料」。

連接 S3 相容的物件存儲

SQL Server 2022(16.x)及後續版本支援 S3 相容的儲存裝置,如 Amazon S3、MinIO 和 Ceph。

如需詳細資訊,請參閱設定 PolyBase 以存取與 S3 相容物件儲存體中的外部資料

以 CREATE EXTERNAL TABLE AS SELECT(CETAS) 匯出資料

CETAS 會將查詢結果匯出到外部檔案(Parquet 或 CSV),存放於 Azure Blob Storage、ADLS Gen2 或相容 S3 的儲存中。

SQL 平台 支援 匯出格式 Notes
SQL Server 2022 (16.x) 及更新版本 是的 Parquet,CSV 需要 伺服器設定:允許 Polybase 匯出
Azure SQL 受控執行個體 是的 Parquet,CSV 預設為停用
Azure SQL Database No 沒有 無法提供
Fabric 中的 SQL 資料庫 No 沒有 無法提供

關於 Transact-SQL 參考,請參見 「建立外部資料表作為 SELECT(CETAS)」。

快速入門範例

範例 1:對 Parquet 檔案(OPENROWSET)進行臨時查詢

不需要外部工作台。 可在 SQL Server 2022(16.x)及更新版本、Azure SQL 資料庫、Azure SQL 管理實例,以及 Fabric 中的 SQL 資料庫上運作。

SELECT TOP 10 *
FROM OPENROWSET (
    BULK 'abs://mycontainer@mystorageaccount.blob.core.windows.net/data/sales/*.parquet',
    FORMAT = 'PARQUET'
) AS [result];

範例 2:Azure Blob Storage 中 CSV 的外部資料表

此範例適用於所有支援 PolyBase 的 SQL 平台。

  • 步驟 1:建立資料庫主金鑰(DMK)。 此步驟是必要的,因為憑證儲存了 SAS 令牌秘密。 不過,如果你使用管理身份驗證或 Microsoft Entra 認證,這個步驟是可以做到的。

    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<strong_password>';
    
  • 步驟 2:用 SAS 令牌建立憑證。 省略前導 ?

    CREATE DATABASE SCOPED CREDENTIAL MyStorageCred
    WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
         SECRET = '<your_SAS_token>'; -- omit the leading '?'
    
  • 步驟三:建立外部資料來源。

    CREATE EXTERNAL DATA SOURCE MyAzureStorage
    WITH (
        LOCATION = 'abs://mycontainer@mystorageaccount.blob.core.windows.net',
        CREDENTIAL = MyStorageCred
    );
    
  • 步驟四:為 CSV 建立檔案格式。

    CREATE EXTERNAL FILE FORMAT CsvFormat
    WITH (
        FORMAT_TYPE = DELIMITEDTEXT,
        FORMAT_OPTIONS (
            FIELD_TERMINATOR = ',',
            STRING_DELIMITER = '"',
            FIRST_ROW = 2
        )
    );
    
  • 步驟五:建立外部表格。

    CREATE EXTERNAL TABLE dbo.SalesExternal
    (
        OrderId INT,
        OrderDate DATE,
        Amount DECIMAL (18, 2),
        Customer NVARCHAR (100)
    )
    WITH (
        DATA_SOURCE = MyAzureStorage,
        LOCATION = '/data/sales/',
        FILE_FORMAT = CsvFormat
    );
    
  • 步驟 6:查詢外部資料表。

    SELECT *
    FROM dbo.SalesExternal
    WHERE OrderDate >= '2025-01-01';
    

範例 3:查詢另一個 SQL Server 中的資料表

此範例適用於 SQL Server 2019(15.x)及更新版本。

  • 步驟 1:建立資料庫主金鑰(因為憑證會儲存密碼,因此必須建立)。

    CREATE MASTER KEY ENCRYPTION
    BY PASSWORD = '<strong_password>';
    
  • 步驟 2:為遠端 SQL Server 實例建立憑證。

    CREATE DATABASE SCOPED CREDENTIAL RemoteSqlCred
    WITH IDENTITY = 'remote_user',
         SECRET = '<password>';
    
  • 步驟三:建立外部資料來源。

    CREATE EXTERNAL DATA SOURCE RemoteSqlServer
    WITH (
        LOCATION = 'sqlserver://remote-server.contoso.com',
        PUSHDOWN = ON,
        CREDENTIAL = RemoteSqlCred
    );
    
  • 步驟 4:建立外部資料表(在 LOCATION 中指定三部分名稱)。

    CREATE EXTERNAL TABLE dbo.RemoteCustomers
    (
        CustomerId INT,
        CustomerName NVARCHAR (200)
            COLLATE SQL_Latin1_General_CP1_CI_AS
    )
    WITH (
        DATA_SOURCE = RemoteSqlServer,
        LOCATION = 'SalesDB.dbo.Customers'
    );
    
  • 步驟五:跨伺服器查詢。

    SELECT c.CustomerName,
           s.Amount
    FROM dbo.RemoteCustomers AS c
         INNER JOIN dbo.LocalSales AS s
             ON c.CustomerId = s.CustomerId;
    

範例 4:將結果匯出至 Parquet,使用 CETAS

可在 SQL Server 2022(16.x)及更新版本、Azure SQL Managed Instance 上運作。

  • 步驟 1:啟用 CETAS(僅限 SQL Server)。

    EXECUTE sp_configure 'allow polybase export', 1;
    RECONFIGURE;
    
  • 步驟 2:建立憑證與資料來源(重用前述範例)。

  • 步驟三:建立 Parquet 匯出的檔案格式。

    CREATE EXTERNAL FILE FORMAT ParquetFormat
    WITH (
        FORMAT_TYPE = PARQUET
    );
    
  • 步驟四:匯出查詢結果。

    CREATE EXTERNAL TABLE dbo.Sales2025Export
    WITH (
        DATA_SOURCE = MyAzureStorage,
        LOCATION = '/exports/sales_2025.parquet',
        FILE_FORMAT = ParquetFormat
    ) AS
    SELECT *
    FROM Sales.Orders
    WHERE OrderDate >= '2025-01-01';
    

PolyBase 的 T-SQL 建構模組

在實作任何情境前,先了解 PolyBase 使用的核心 T-SQL 物件及其如何相互配合:

展示 PolyBase Transact-SQL 物件及其關係的圖表。

圖示顯示 PolyBase T-SQL 物件及其關係,從認證(資料庫主金鑰、憑證)到資料來源與檔案格式,再到查詢方法(外部資料表、OPENROWSET、BULK INSERT、CETAS)。

關於這些 T-SQL 語句的資訊,請參見:

所有物件的完整 Transact-SQL 參考,請參見 PolyBase Transact-SQL 參考

這很重要

檢查你外部檔案格式的資料型別映射。 當你建立外部檔案格式或使用 OPENROWSET查詢檔案時,PolyBase 會自動將原始資料型態(Parquet、CSV、Delta、Oracle、Teradata、MongoDB)對應到 SQL Server 的資料型別。 類型不匹配可能導致靜默截斷、精度損失或查詢錯誤。 例如,一個 Parquet DECIMAL(38,18) 映射到 DECIMAL(18,0)。 在定義外部資料表的欄位或子句 WITH 之前,請先檢視映射表。 完整參考請參見 PolyBase 的類型映射

什麼時候需要建立主金鑰?

資料庫主鍵(DMK)是透過 CREATE MASTER KEY 語法建立的。 DMK 會加密資料庫範圍憑證中儲存的秘密。 只有當憑證包含秘密值,也就是儲存密碼、令牌或存取金鑰時,才需要使用。

  • DMK 是必須 的(憑證會儲存一個秘密資料):

    驗證類型 IDENTITY 有秘密 DMK
    SAS 權杖 'SHARED ACCESS SIGNATURE' 是的 Required
    S3 存取金鑰 'S3 ACCESS KEY' 是的 Required
    SQL 登入/基本認證 '<username>' 是的 Required
    儲存體帳戶存取金鑰 '<storage_account_name>' 是的 Required
  • DMK 不強制 (不儲存秘密資料):

    驗證類型 IDENTITY 有秘密 DMK
    受控識別 'Managed Identity' No 非必要
    Microsoft Entra ID 'User Identity''Managed Identity' No 非必要

小提示

如果在您的 CREATE DATABASE SCOPED CREDENTIAL 陳述中沒有任何秘密,那麼您不需要使用 DMK。 管理身份(Managed Identity)與 Microsoft Entra ID 認證將信任委派給平台。 資料庫不會儲存密碼或令牌。

範例:

在這個範例查詢中,DMK 是必要的(憑證儲存 SAS 令牌)。

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<strong_password>';

CREATE DATABASE SCOPED CREDENTIAL SasCred
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
     SECRET = '<your_SAS_token>';

在這個範例查詢中,不需要 DMK(受管理的身份識別,無需秘密)。

CREATE DATABASE SCOPED CREDENTIAL ManagedIdentityCred
WITH IDENTITY = 'Managed Identity';

在這個範例查詢中,DMK 並非必需(Microsoft Entra 直通,沒有秘密)。

CREATE DATABASE SCOPED CREDENTIAL EntraIdCred
WITH IDENTITY = 'User Identity';

透過 OPENROWSET 與外部資料表進行遠端資料存取

SQL Server 提供三種不同的遠端資料查詢方式。 當你了解語法、認證和架構的差異時,就能選擇正確的方法。

方法 語法 連線到 驗證 PolyBase 服務 平台
OLE DB 查詢 OPENROWSET(provider, connection, query) 任何透過 MSOLEDBSQL、SQLOLEDB 或其他提供者提供的 OLE DB 來源 SQL 認證、Windows 認證、Microsoft Entra ID (MSOLEDBSQL) No SQL Server(所有支援版本)
檔案查詢 OPENROWSET(BULK ...) 本地磁碟、網路或雲端上的檔案(Azure Blob、ADLS、S3、OneLake) SAS 令牌、存取金鑰、管理身份、Microsoft Entra ID 雲端適用;本地不適用 SQL Server 2005;SQL Server 2022(16.x)及更新版本(雲端);Azure SQL
PolyBase 連接器 CREATE EXTERNAL TABLECREATE EXTERNAL DATA SOURCE 使用 sqlserver://oracle://teradata://mongodb://odbc:// 遠端SQL Server、Oracle、Teradata、MongoDB、ODBC 來源 僅限 SQL 驗證 是的 SQL Server 2019(15.x)及更新版本(Windows);SQL Server 2025(17.x)及更新版本(Linux)

在 SQL Server 2019(15.x)和 SQL Server 2022(16.x)中,雲端檔案存取是必須使用 PolyBase 服務的。 SQL Server 2025(17.x)及後續版本具備原生雲端檔案支援,不再需要 PolyBase 來使用 CSV、Parquet 或 Delta。

何時使用每種方法

使用 OLE DB OPENROWSET 用於:

  • 快速且一次性的臨時查詢,無需建立持久物件
  • Microsoft Entra ID 或管理身份驗證(透過 MSOLEDBSQL)
  • 避免對 PolyBase 服務的相依
  • 連接至任何使用 OLE DB 提供者的資料來源

使用 檔案 OPENROWSET(BULK) 來:

  • 臨時檔案探索與結構發現
  • 在確認資料表定義前,快速進行轉換與預覽
  • 彈性欄位轉換(投射、過濾、計算欄位)
  • 這些資料不會經常變動,也不需要持續的元資料

使用 PolyBase 連接器來使用 CREATE EXTERNAL TABLE

  • 多個使用者或應用程式存取的持久且可重用的資料表定義
  • 生產工作負載需要統計與查詢計畫優化
  • 將運算推送到遠端來源(過濾器推送到 Oracle、SQL Server 等)
  • 共享治理與安全(建立後,使用者只需要擁有 SELECT 權限)
  • 當你遠端來源有 SQL 認證時

OPENROWSET(OLE DB)- 臨時遠端查詢(無需 PolyBase 服務)

OLE DB 形式 OPENROWSET 透過 OLE DB 提供者連接遠端資料來源,執行直通查詢,並將結果以列集形式回傳。 它是一種一次性、臨時的替代方案,取代連結伺服器。 不會產生持久的元資料。 這種語法不需要 PolyBase 服務,也不支援雲端檔案或外部資料來源。

這個範例查詢是透過 OLE DB(非 PolyBase)連接到遠端 SQL Server。

SELECT *
FROM OPENROWSET (
    'MSOLEDBSQL',
    'Server=remote-server;Database=AdventureWorks;Trusted_Connection=yes;',
    'SELECT TOP 10 * FROM AdventureWorks.Sales.SalesOrderHeader'
);

OPENROWSET(BULK)-基於檔案的查詢(PolyBase)

BULK格式的OPENROWSET直接從檔案讀取資料。 在 SQL Server 2019(15.x)及更早版本中,它可從本地或 UNC 檔案路徑讀取,並需要格式化檔案。 在 SQL Server 2022(16.x)及更新版本中,你可以用 DATA_SOURCE 參數從FORMAT讀取資料。 此方法即為用於資料虛擬化的 PolyBase 整合版本。

在 PolyBase 與資料虛擬化的語境中,本指南指出OPENROWSETOPENROWSET(BULK ...)語法,其中包含用於查詢外部檔案的FORMAT子句。

範例:

此範例查詢讀取 Azure Blob Storage(SQL Server 2022 及更新版本)中的 Parquet 檔案。

SELECT TOP 10 *
FROM OPENROWSET (
    BULK 'data/sales/*.parquet',
    DATA_SOURCE = 'MyAzureStorage',
    FORMAT = 'PARQUET'
) AS [result];

此範例查詢讀取一個帶有內嵌路徑的 Parquet 檔案(Azure SQL 資料庫、Azure SQL 管理實例)。

SELECT TOP 10 *
FROM OPENROWSET (
    BULK 'abs://mycontainer@mystorageaccount.blob.core.windows.net/data/sales/*.parquet',
    FORMAT = 'PARQUET'
) AS [result];

何時使用 OPENROWSET 與外部資料表

兩者 OPENROWSET(BULK ...) 和外部資料表都允許你用 T-SQL 查詢外部資料,但它們是為不同用途設計的。 下表總結了主要差異,幫助你決定哪種方法最適合你的情境。

能力 OPENROWSET(BULK ...) 外部數據表
Purpose 臨時探索與一次性查詢 持久且可重用的資料表定義
資料庫中儲存的元資料 否。 查詢執行後不會儲存任何東西 是的。 資料表定義、資料來源及檔案格式皆以資料庫物件形式儲存
模式定義 可自動從檔案格式(Parquet)推斷,或使用語法 WITH 直接指定 明確定義於該 CREATE EXTERNAL TABLE 陳述中
許可 必需ADMINISTER BULK OPERATIONSADMINISTER DATABASE BULK OPERATIONS 一旦建立,桌面上的標準 SELECT 權限就足夠了
計算欄位 是的。 在列表中新增表達式和計算欄位 SELECT ;像 filename()filepath() 這樣的元資料函式僅在此可用。 否。 固定欄位列表;在檢視或讀取外部資料表的查詢中執行轉換
統計資料 Azure SQL:透過sys.sp_create_openrowset_statistics手動建立單一欄位統計;SQL Server 2022(16.x)及後續版本:對謂詞自動建立統計(在 SQL Server 上無法手動建立統計)。 請參閱 OPENROWSET 手冊統計資料 所有平台皆完全支援 CREATE STATISTICS,且在 SQL Server 2022(16.x)及更新版本中提供自動建立功能。 請參閱 手動建立外部表統計資料
下壓 支援有限。 引擎可能會將過濾器推送到檔案掃描,但不會推送到遠端的 RDBMS 來源 是的。 支援 RDBMS 連接器(SQL Server、Oracle、Teradata、MongoDB)的推送計算
適用對象 資料探索、結構發現、查詢原型、一次性資料載入、靈活轉換 生產工作負載、重複查詢、跨使用者共享存取、儀表板與報告

需要彈性時使用 OPENROWSET

可用 OPENROWSET 來探索檔案、測試不同結構,或新增計算出的欄位與轉換,且不建立任何持久物件。 例如,你可以將檔案路徑擷取為欄位、直接轉換資料型別,或在單一查詢中對計算後的表達式進行過濾。

此範例查詢包含計算出的欄位與轉換:

SELECT result.filename() AS [FileName],
       result.filepath(1) AS [Year],
       result.filepath(2) AS [Month],
       CAST (OrderDate AS DATE) AS OrderDate,
       Amount,
       OrderDate
FROM OPENROWSET (
    BULK 'abs://mycontainer@mystorageaccount.blob.core.windows.net/data/sales/*/*/*/*.parquet',
    FORMAT = 'PARQUET'
) AS result
WHERE result.filepath(1) = '2025';

小提示

這些filepath()filename()函式可在 Azure SQL 資料庫、Azure SQL 管理實例,以及 SQL Server 2022(16.x)及更新版本中使用。 它們允許你在檔案路徑的部分(分割區消除)進行過濾,並將來源檔名暴露為欄位,這是外部資料表無法直接實現的。

需要持久化和治理時,使用外部資料表

當多個使用者或應用程式需要反覆查詢相同的外部資料時,請使用外部資料表。 你只需定義一次架構、資料來源和憑證,然後將它們儲存在資料庫中。 消費者只需擁有表格上的SELECT許可權。

外部資料表也支援 統計資料,查詢優化器會利用統計資料來建立更完善的執行計畫。 你可以手動建立統計數據,或讓引擎自動產生統計數據(SQL Server 2022(16.x)及後續版本)。

此範例查詢會在外部資料表上建立統計資料,以優化查詢計畫。

CREATE STATISTICS Stats_OrderDate
ON dbo.SalesExternal(OrderDate)
WITH FULLSCAN;

欲了解更多兩種方法的統計資訊,請參閱 PolyBase 效能考量 - 統計

BULK INSERT 與 OPENROWSET(BULK):我該用哪一個?

兩者皆BULK INSERTOPENROWSET(BULK ...)可透過相同的底層 bulk-load 引擎,從檔案匯入資料至 SQL Server。 不過,它們在語法、彈性以及你能用結果做什麼上有所不同。 下表摘要說明重要差異:

備註

BULK INSERT 在 Fabric 的 SQL 資料庫中找不到。 至於 Fabric,可以用 OPENROWSET(BULK ...) 來對抗 OneLake。

能力 BULK INSERT OPENROWSET(BULK ...)
基本目的 直接從檔案載入 資料到目標資料表 回傳一個行集,用於語句中使用。
使用模式 獨立陳述: BULK INSERT <table> FROM '<file>' 必須在查詢中使用: SELECT * FROM OPENROWSET(BULK ...)INSERT INTO <table> SELECT * FROM OPENROWSET(BULK ...)
需要目標表嗎? 是的。 總是直接寫入資料表 否。 你可以 SELECT 從它中取出,不用插入任何地方,或插入任何表格或暫存表格
載荷時的柱狀變換 支援有限。 資料從檔案流向表 as-is(映射由格式、檔案或欄位順序控制) 全力支持。 你可以在周圍新增表達式、CASTWHERE、篩選器、JOIN其他表格,以及計算出來的欄位SELECT
表格提示 WITH條款包括對BATCHSIZECHECK_CONSTRAINTSFIRE_TRIGGERSKEEPIDENTITYKEEPNULLSTABLOCK及其他的支持。 透過 INSERT ... SELECT * FROM OPENROWSET(BULK ...) WITH (TABLOCK, IGNORE_CONSTRAINTS, ...) 語法支援表格提示功能
大型物件(LOB)單一值匯入 不支援 是的。 支援 SINGLE_BLOBSINGLE_CLOBSINGLE_NCLOB將整個檔案匯入為一個 varbinary(max)、varchar(max)nvarchar(max)
格式化檔案 是的。 支援方式(XML 與非 XML) 是的。 支援(XML 與非 XML)
Cloud file access (Azure Blob Storage, ADLS Gen2, S3) 是的。 透過 DATA_SOURCE 參數支援(SQL Server 2017 (14.x)及後續版本,Azure SQL) 是的。 支援透過 DATA_SOURCE 參數或含 FORMAT 子句的內嵌網址(SQL Server 2022(16.x)及後續版本,Azure SQL)
Parquet或Delta文件 不支援。 僅限 CSV/定界文字 是的。 支援 FORMAT = 'PARQUET'FORMAT = 'DELTA' (SQL Server 2022(16.x)及更新版本,Azure SQL)
所需權限 ADMINISTER BULK OPERATIONSADMINISTER DATABASE BULK OPERATIONS,以及目標表上的 INSERT ADMINISTER BULK OPERATIONSADMINISTER DATABASE BULK OPERATIONS
最小記錄 是的。 支援於簡單或批量記錄的復原模型中,且 TABLOCK 是的。 與INSERT ... SELECTTABLOCK一起使用時受支持

何時選擇 BULK INSERT

當你有直接的檔案到表格載入,且匯入時不需要轉換、篩選或合併資料時使用 BULK INSERT 。 它對 CSV 或其他分隔檔案使用較簡單的語法:

這個範例查詢會直接從 Azure Blob Storage 載入 CSV 檔案到資料表中。

BULK INSERT Sales.Invoices
FROM 'invoices/inv-2025-01.csv'
WITH (
    DATA_SOURCE = 'MyAzureBlobStorage',
    FORMAT = 'CSV',
    FIRSTROW = 2,
    FIELDTERMINATOR = ',',
    ROWTERMINATOR = '\n'
);

此範例查詢載入一個本地檔案,並附有用於欄位映射的格式檔案。

BULK INSERT dbo.Products
FROM 'C:\Data\products.csv'
WITH (
    FORMATFILE = 'C:\Data\products.fmt',
    FIRSTROW = 2,
    TABLOCK
);

何時選擇 OPENROWSET(BULK)

當您需要以下一項或多項條件時,請使用 OPENROWSET(BULK ...)

  • 查詢或預覽 檔案資料,無需先建立資料表。
  • 匯入時可以轉換、篩選或合併資料。
  • 載入 Parquet 或 Delta 檔案(僅 OPENROWSET 支援這些格式)。
  • 將整個檔案匯入為單一 LOB 值SINGLE_BLOBSINGLE_CLOBSINGLE_NCLOB)。

這個範例查詢是預覽 Azure Blob Storage 的 CSV 檔案,但沒有插入任何資料。

SELECT TOP 10 *
FROM OPENROWSET (
    BULK 'invoices/inv-2025-01.csv',
    DATA_SOURCE = 'MyAzureBlobStorage',
    FORMAT = 'CSV',
    FIRSTROW = 2,
    FIELDTERMINATOR = ','
) AS src;

此範例查詢插入帶有轉換與篩選的資料。

INSERT INTO Sales.Invoices (InvoiceDate, Amount, Customer)
SELECT CAST (InvoiceDate AS DATE),
       Amount * 1.1, -- Apply a 10% markup
       UPPER(Customer)
FROM OPENROWSET (
    BULK 'invoices/inv-2025-01.csv',
    DATA_SOURCE = 'MyAzureBlobStorage',
    FORMAT = 'CSV',
    FIRSTROW = 2
) WITH (
    InvoiceDate VARCHAR (10),
    Amount DECIMAL (18, 2),
    Customer VARCHAR (100)
) AS src
WHERE Amount IS NOT NULL;

此範例查詢可載入 Parquet 檔案,但(BULK INSERT 不能執行此操作)。

INSERT INTO Sales.Invoices
SELECT *
FROM OPENROWSET (
    BULK 'data/invoices/*.parquet',
    DATA_SOURCE = 'MyAzureStorage',
    FORMAT = 'PARQUET') AS src;

此範例查詢將整個 XML 檔案匯入為單一varbinary(max) 值。

INSERT INTO dbo.XmlDocuments (DocContent)
SELECT BulkColumn
FROM OPENROWSET (
    BULK 'C:\Data\catalog.xml',
    SINGLE_BLOB
) AS x;

小提示

一種方法是在OPENROWSET(BULK ...)SELECT中探索和驗證文件數據,然後如果不需要轉換,切換到BULK INSERT以進行最終生產負載。 如果你需要 Parquet、Delta 或內嵌過濾的支持,請繼續使用 OPENROWSET

欲了解更多資訊,請參閱以下相關指南:

有用的元資料功能

當你查詢帶有 OPENROWSET 外部資料表的外部檔案時,可以使用多種內建函式與程序來檢查檔案中繼資料、發現結構,並實作分區感知查詢。

filepath() 與 filename()

filepath() 函數和 filename() 函數會針對結果集中的每一列,回傳檔案路徑的部分或檔案名稱。 它們特別適合以下用途:

  • 分割區消除:在資料夾區段(例如年份/月份/日分割區)上進行過濾,讓引擎只讀取匹配的檔案,而非掃描所有檔案。

  • 揭露原始元資料:在查詢結果中將原始檔名或路徑作為欄位,這對於稽核或除錯非常有幫助。

功能 退貨 範例
filename() 每一列的原始檔案名稱(含副檔名) sales_2025_01.parquet
filepath(N) 路徑中通配符(*BULK個資料夾段,其中 N 從 1 開始 對於路徑 sales/2025/01/*.parquet,返回 filepath(1)2025filepath(2) 返回 01

適用於:Azure SQL 資料庫、Azure SQL 管理實例、SQL Server 2022(16.x)及後續版本、Fabric 中的 SQL 資料庫。

此範例查詢用於 filepath() 分割區消除及 filename() 識別原始檔案。 它只讀取資料夾下的 /2025/ 檔案,且只讀取子資料夾下的 /06/ 檔案。

SELECT result.filename() AS SourceFile,
       result.filepath(1) AS [Year],
       result.filepath(2) AS [Month],
       *
FROM OPENROWSET (
    BULK 'abs://mycontainer@mystorageaccount.blob.core.windows.net/data/sales/*/*/*.parquet',
    FORMAT = 'PARQUET'
) AS result
WHERE result.filepath(1) = '2025' 
      AND result.filepath(2) = '06';

小提示

filepath()篩選器放置在WHERE子句中,而非加入至子查詢或CTE中。 當篩選條件包含在WHERE子句中時,引擎可以在掃描檔案的層級上執行分割區剔除,大幅減少I/O。

sp_describe_first_result_set - 探索 OPENROWSET 欄位類型

當你使用 OPENROWSET 時搭配 Parquet 檔案,引擎會以自動推斷欄位資料類型(結構推論)。 推斷出的類型可能比必要的還要大。 例如,字元欄位常被推斷為 varchar(8000), 因為 Parquet 的元資料不包含最大長度。 這種選擇可能會降低效能並消耗更多記憶體。

在完成查詢sp_describe_first_result_set,請先檢查推斷出的結構。 看到推斷型別後,在子 WITH 句中指定較窄型別以提升效能。

  • 步驟 1:檢查推斷出的結構。

    EXECUTE sp_describe_first_result_set N'
    SELECT *
    FROM OPENROWSET(
        BULK ''abs://mycontainer@mystorageaccount.blob.core.windows.net/data/sales/*.parquet'',
        FORMAT = ''PARQUET''
    ) AS result';
    

    輸出顯示每欄名稱、推斷資料類型、最大長度、精確度及縮放範圍。 如果你看到 varchar(8000),而 varchar(100) 就足夠,請改用:

  • 步驟二:使用明確型別以提升效能。

    SELECT TOP 100 *
    FROM OPENROWSET (
        BULK 'abs://mycontainer@mystorageaccount.blob.core.windows.net/data/sales/*.parquet',
        FORMAT = 'PARQUET'
    ) WITH (
        OrderId INT,
        OrderDate DATE,
        Amount DECIMAL (18, 2),
        Customer VARCHAR (100) -- much narrower than the inferred varchar(8000)
    ) AS result;
    

結構推論只適用於 Parquet 檔案。 對於 CSV 檔案,務必在 WITH 子句(針對 OPENROWSET)或在 CREATE EXTERNAL TABLE 語句中指定欄位定義。 sp_describe_first_result_set 是通用的 SQL Server 和 Azure SQL 程序,但對於查詢 OPENROWSET 特別有用。 欲了解更多資訊,請參見 sp_describe_first_result_set

效能、故障排除與最佳實務

實施資料虛擬化後,請參考以下指南優化效能、診斷問題並確保生產準備狀態:

適用範圍 發行項 詳細資料
PolyBase 效能 PolyBase 中適用於 SQL Server 的效能考量 統計、推下、平行處理與記憶體管理
下推計算 PolyBase 中的下推計算 指定哪些操作要推送到遠端來源
如何判斷是否發生了下壓 如何判斷是否發生外部下推 查詢計畫與動態管理檢視(DMV)
Troubleshooting 監視 PolyBase 並進行疑難排解 常見錯誤和解決方案
Kerberos 連接性 排解 PolyBase Kerberos 連線問題
常見問題集 PolyBase常見問題
錯誤與解法 PolyBase 錯誤和可能的解決方案