適用於: SQL Server 2016 (13.x)及以後版本
Azure SQL Database
Azure SQL 受控執行個體
Microsoft Fabric 中的 SQL 資料庫
資料虛擬化 讓你能對外部資料執行 Transact-SQL(T-SQL)查詢,而不必將資料載入資料庫。 你定義一個外部資料來源、可選的檔案格式和外部資料表,然後像其他資料表一樣查詢 SELECT 外部資料表。
本指南能幫助你:
- 了解你的 SQL 平台和版本支援哪些 PolyBase 功能。
- 在查詢或匯入資料時,選擇
OPENROWSET、 外部資料表 和BULK INSERT。 - 請參考逐步連結了解常見情境。
- 檢視效能、故障排除及生產工作負載的最佳實務。
平台支援
- PolyBase 是 Microsoft SQL 資料庫引擎 的一項功能,實作資料虛擬化。
- PolyBase 支援於 Windows 的 SQL Server 2016 及以後版本,以及 Linux 上的 SQL Server 2019 及以後版本。
- PolyBase 在 Linux 版 SQL Server 2017 中不被支援。
- PolyBase 不支援 Azure SQL Database,但 Azure SQL Database 透過外部資料表提供相關的資料虛擬化功能
OPENROWSET。 如需詳細資訊,請參閱使用 Azure SQL Database 的數據虛擬化(預覽版)。 - PolyBase 並非 Azure SQL 受控執行個體 的名稱功能,但 Azure SQL 受控執行個體 有類似的資料虛擬化功能。 如需詳細資訊,請參閱使用 Azure SQL 受控執行個體進行資料虛擬化。
- PolyBase 在 Fabric 的 SQL 資料庫中不被支援,但 Fabric 中的 SQL 資料庫為 OneLake 中的資料提供自己的虛擬化功能。 欲了解更多資訊,請參閱 Fabric 中 SQL 資料庫中的資料虛擬化。
- PolyBase 不是 Fabric Data Warehouse 的功能。 若要在 Fabric Data Warehouse 中進行資料虛擬化,請考慮 Fabric OneLake Shortcuts。 關於 Fabric Data Warehouse 中資料載入的文章,請參見使用 T-SQL 的資料擷取與維度建模:載入資料表。
常見使用案例
下表描述了可能的使用情境。
| 情境 | 使用 |
|---|---|
| 即時檔案探索 | OPENROWSET(BULK ...) |
| 可重複使用的檔案查詢用於 BI 或報告 | 檔案上的外部資料表 |
| 跨資料庫查詢 (SQL Server、Oracle、Teradata、MongoDB、ODBC) | 帶有外部表格的 PolyBase 連接器 |
| 將查詢結果匯出為檔案 |
CREATE EXTERNAL TABLE AS SELECT (CETAS) |
| 大量資料匯入表格 |
BULK INSERT或OPENROWSET(BULK ...)與INSERT ... SELECT |
- 對於臨時檔案探索,請使用
OPENROWSET(BULK ...)檢查檔案而無需建立可重複使用的表格。 - 在 BI 或報告情境中進行可重複使用的檔案查詢,使用外部資料表覆蓋檔案來持久化結構並在查詢間共享結果。
- 跨資料庫查詢時,使用帶有外部資料表的 PolyBase 連接器來存取 SQL Server、Oracle、Teradata、MongoDB 或 ODBC 來源。
- 若要將查詢結果匯出至檔案,請使用
CREATE EXTERNAL TABLE AS SELECT(CETAS) 將輸出以 Parquet 或 CSV 格式寫入資料庫外部。 - 若要大量匯入至資料表,請使用
BULK INSERT或OPENROWSET(BULK ...)搭配INSERT ... SELECT,將檔案資料載入資料庫資料表。
哪些功能在哪裡可用?
下表顯示自 SQL Server 2019 起,每個 SQL 平台可用的核心 PolyBase 與資料虛擬化功能。 關於 SQL Server 2016 與 SQL Server 2017 在 Windows 上的可用性,請參見 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 受控執行個體 | 是 3 | 是 3 | 是 3 | No | No | No |
| 連接 Oracle / Teradata / MongoDB | 是的 | 是的 | 是的 | No | No | No |
| 連線至 Azure Blob 儲存體 | 是的 | 是的 | 是的 | 是的 | 是的 | No |
| 連接 ADLS Gen2 | 是 5 | 是的 | 是的 | 是的 | 是的 | 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 = DELTA、 FORMAT = 'CSV'和 。
SQL Server 2019(15.x)中 2 CSV 支援曾需 Hadoop。 在 SQL Server 2022(16.x)及之後版本中,CSV 原生支援,無需 Hadoop。
3 使用 SQL Server 連接器(sqlserver://)。 資料庫範圍憑證以 SQL 端點為目標。 使用與連接其他 SQL Server 實例相同的步驟。
4 支援管理身份驗證以連接 Azure Blob 儲存體(ABS)及 ADLS Gen2。 這需要使用 Azure Arc 啟用的 SQL Server 或是在 Azure VM 上運行的 SQL Server,以管理本地的 SQL Server。 它原生支援 Azure SQL 資料庫和 Azure SQL 管理實例。
5 SQL Server 2019 CU11 及以後版本支援帶有 abfs or abfss 前綴的 Azure Data Lake Storage Gen2。 在 SQL Server 2022 及更新版本中,請使用 前綴。adls
- SQL Server 2019、SQL Server 2022、SQL Server 2025、Azure SQL Database、Azure SQL 受控執行個體 以及 Microsoft Fabric 中的 SQL 資料庫都支援外部資料表。
-
OPENROWSET (BULK)支援於 SQL Server 2019、SQL Server 2022、SQL Server 2025、Azure SQL Database、Azure SQL 受控執行個體 以及 Microsoft Fabric 中的 SQL 資料庫。 SQL Server 2019 支援本地及網路檔案路徑,而 SQL Server 2022 及以後版本也支援讀取雲端儲存,包含FORMAT = 'PARQUET'、FORMAT = DELTA、FORMAT = 'CSV'和 。 - SQL Server 2019、Azure SQL Database 或 Microsoft Fabric 的 SQL 資料庫都不支援 CETAS 匯出。 CETAS 匯出支援於 SQL Server 2022、SQL Server 2025 及 Azure SQL 受控執行個體。
- SQL Server 2019、SQL Server 2022、SQL Server 2025、Azure SQL Database、Azure SQL 受控執行個體 以及 Microsoft Fabric 中的 SQL 資料庫都支援 CSV 與分隔檔案。 SQL Server 2019 需要 Hadoop 來支援 CSV,而 SQL Server 2022 及以後版本則原生支援 CSV,無需 Hadoop。
- SQL Server 2019 不支援 Parquet 檔案。 SQL Server 2022、SQL Server 2025、Azure SQL Database、Azure SQL 受控執行個體,以及 Microsoft Fabric 中的 SQL 資料庫皆支援 Parquet 檔案。
- Delta Lake 表格在 SQL Server 2019、Azure SQL Database、Azure SQL 受控執行個體 或 Microsoft Fabric 的 SQL 資料庫中都不被支援。 Delta Lake 資料表在 SQL Server 2022 與 SQL Server 2025 中皆有支援。
- SQL Server 2019、SQL Server 2022 及 SQL Server 2025 支援連接其他 SQL Server 實例。 Azure SQL Database、Azure SQL 受控執行個體 或 Microsoft Fabric 中的 SQL 資料庫都不支援連接其他 SQL Server 實例。
- 從 SQL Server 2019、SQL Server 2022 和 SQL Server 2025 開始,支援使用 SQL Server 連接器連線到 Azure SQL Database 或 Azure SQL 受控執行個體。 資料庫範圍的憑證針對 Azure SQL Database 或 Azure SQL 受控執行個體 端點,設定步驟與連接其他 SQL Server 實例相同。 這些連線不支援來自 Azure SQL Database、Azure SQL 受控執行個體 或 Microsoft Fabric 的 SQL 資料庫。
- 從 SQL Server 2019、SQL Server 2022 和 SQL Server 2025 起,支援連接 Oracle、Teradata 或 MongoDB。 這些連線不支援來自 Azure SQL Database、Azure SQL 受控執行個體 或 Microsoft Fabric 的 SQL 資料庫。
- 自 SQL Server 2019、SQL Server 2022、SQL Server 2025、Azure SQL Database 和 Azure SQL 受控執行個體 起,支援連線到 Azure Blob 儲存體。 Microsoft Fabric 的 SQL 資料庫不支援連接 Azure Blob 儲存體。
- 在 CU11 之前的 SQL Server 2019 版本中,或在 Microsoft Fabric 中的 SQL 資料庫內,都不支援連線至 ADLS Gen2。 從 SQL Server 2019 CU11 開始支援連接 ADLS Gen2,並在 SQL Server 2022、SQL Server 2025、Azure SQL Database 和 Azure SQL 受控執行個體 中支援。
- SQL Server 2019、Azure SQL Database、Azure SQL 受控執行個體 或 Microsoft Fabric 的 SQL 資料庫都不支援連接 S3 相容的儲存裝置。 從 SQL Server 2022 和 SQL Server 2025 起,支援連接 S3 相容的儲存裝置。
- 支援從 Microsoft Fabric 中的 SQL 資料庫連線到 OneLake。 不支援從 SQL Server 2019、SQL Server 2022、SQL Server 2025、Azure SQL Database 或 Azure SQL 受控執行個體 連線到 OneLake。
- SQL Server 2019、SQL Server 2022 及 SQL Server 2025 支援推推計算。 Azure SQL Database、Azure SQL 受控執行個體 或 Microsoft Fabric 的 SQL 資料庫都不支援推下運算。
- SQL Server 2019 和 SQL Server 2022 不支援管理身份驗證。 SQL Server 2025 支援使用受控識別驗證來連線至 Azure Blob 儲存體 和 ADLS Gen2,且需要 Azure Arc 啟用的 SQL Server 或在 Azure 虛擬機器上執行的 SQL Server。 管理式身份驗證也支援於 Azure SQL Database 和 Azure SQL 受控執行個體,但在 Microsoft Fabric 的 SQL 資料庫中則不支援。
備註
自 SQL Server 2025(17.x)起,查詢 Azure Blob 儲存體、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 | SQL Server 2022:是 1 SQL Server 2025 及更新版本:無 Azure SQL Database、Azure SQL 受控執行個體 以及 Fabric 中的 SQL 資料庫:內建 |
| 持久資料連接器 |
CREATE EXTERNAL TABLE 搭配 sqlserver://、oracle://、teradata://等。 |
你需要持續存取、治理、統計和推下運算來進行生產 | 僅限 SQL 驗證 | 是的 |
1 若要在 SQL Server 2022(16.x)中存取雲端檔案,必須安裝 PolyBase 功能,但 Azure Blob 儲存體、ADLS Gen2 及 S3 相容的儲存連接器並不依賴 PolyBase 服務。 SQL Server 2025(17.x)及後續版本原生支援 CSV、Parquet 與 Delta,無需安裝或執行 PolyBase 服務。
- OLE DB 臨時查詢用於
OPENROWSET(provider, connection, query)快速一次性存取遠端資料來源,無需建立持久物件。 他們可以搭配 MSOLEDBSQL 使用 SQL 驗證、Windows 驗證或 Microsoft Entra ID。 這種情況不需要安裝 PolyBase。 - 對檔案
OPENROWSET(BULK ...)進行臨時查詢,用於快速探索檔案資料或測試結構,然後再建立資料表。 他們可以使用 SAS 憑證、存取金鑰、管理身份碼或 Microsoft Entra ID。 SQL Server 2022 需要為雲端檔案安裝 PolyBase 功能,但不要求 PolyBase 服務。 SQL Server 2025 及以後版本的雲端檔案不需要 PolyBase。 檔案臨時查詢內建於 Azure SQL Database、Azure SQL 受控執行個體 及 Fabric 中的 SQL 資料庫中。 - 持久資料連接器使用
CREATE EXTERNAL TABLE、sqlserver://oracle://、teradata://及類似位置,用於生產工作負載中的持續存取、治理、統計及推下運算。 它們需要SQL認證和PolyBase服務。
決策指南
| 情境 | 建議 |
|---|---|
| 你需要 Microsoft Entra ID 來進行遠端 SQL 驗證,或是想避免 PolyBase 服務。 | 使用 OPENROWSET(MSOLEDBSQL, ...) (臨時使用,無持久物件)。 |
| 你需要持久的資料表、統計數據,或是將運算推送到遠端資料庫。 | 使用CREATE EXTERNAL TABLE 配合 PolyBase 連接器(sqlserver://、oracle://、teradata://、mongodb://、odbc://)。
OPENROWSET 不支援連接器。 |
| 你是在探索新檔案或測試結構。 | 使用 OPENROWSET(BULK ...) (快速迭代,無持久物件)。 |
| 您正將檔案資料經過轉換後匯入資料表。 | 使用 INSERT ... SELECT 來源 OPENROWSET(BULK ...)。 |
| 你需要治理或共享存取權限,讓許多使用者或應用程式都能使用。 | 使用 CREATE EXTERNAL TABLE,即可集中管理權限和中繼資料。 |
| 您目前正在 Fabric 中的 SQL 資料庫中作業。 | 使用 OPENROWSET(BULK ...) 進行臨機 OneLake 查詢,或使用外部資料表來提供可重複使用的存取;若為外部儲存體,則使用 OneLake 捷徑。 |
- 如果您需要使用 Microsoft Entra ID 驗證遠端 SQL,或想避免使用 PolyBase 服務,請使用
OPENROWSET(MSOLEDBSQL, ...)來執行即席遠端查詢,而不需建立永久物件。 - 如果你需要持久資料表、統計資料或將運算下推至遠端資料庫,請使用搭配 PolyBase 連接器(例如
sqlserver://、oracle://、teradata://、mongodb://和odbc://)的CREATE EXTERNAL TABLE。OPENROWSET不支援這些連接器。 - 如果你在探索新檔案或測試結構,建議用
OPENROWSET(BULK ...)快速迭代且不使用持久物件。 - 如果您要將檔案資料擷取到含有轉換的資料表中,請使用來自
OPENROWSET(BULK ...)的INSERT ... SELECT。 - 如果你需要多位使用者或應用程式的治理或共享存取權,請使用
CREATE EXTERNAL TABLESO 權限和元資料集中管理。 - 如果你在 Fabric 的 SQL 資料庫中工作,請使用
OPENROWSET(BULK ...)來進行臨機 OneLake 查詢,或使用外部資料表進行可重複使用的存取;對於外部儲存體,請使用 OneLake 捷徑。
選擇你的情境
現在你已經了解這三種方法,請參考以下指南之一來實作你的特定使用情境。
查詢檔案(Parquet、CSV 或 Delta)
如果你的資料在 Azure Blob 儲存體、ADLS Gen2、S3 相容儲存或 OneLake 上的 Parquet、CSV 或 Delta 檔案中,請遵循以下指南之一:
| 情境 | 推薦指南 | 平台 |
|---|---|---|
| 對 Parquet 或 CSV 檔案進行快速臨時查詢 | 請使用 OPENROWSET。 不需要外部表格 |
SQL Server 2022 (16.x) 及以後版本、Azure SQL 資料庫、Azure SQL 受控執行個體、Fabric 中的 SQL 資料庫 |
| 對具有持久結構的 Parquet 檔案重複查詢 | 在 Parquet 上建立外部資料表 | SQL Server 2022 (16.x) 及以後版本、Azure SQL 資料庫、Azure SQL 受控執行個體、Fabric 中的 SQL 資料庫 |
| 查詢帶有外部資料表的 CSV 檔案 | 建立一個帶有分隔文字檔案格式的外部表格 | SQL Server 2019 (15.x) 及後版本,Azure SQL Database、Azure SQL 受控執行個體、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 受控執行個體 |
- 若要對 Parquet 或 CSV 檔案進行快速臨時查詢,請使用
OPENROWSET。 此方法不需要外部資料表。 SQL Server 2022(16.x)及後續版本、Azure SQL Database、Azure SQL 受控執行個體 以及 SQL Database in Fabric 都支援此模式。 - 對於具有持久結構的 Parquet 檔案重複查詢,請使用外部資料表取代 Parquet。 SQL Server 2022(16.x)及後續版本、Azure SQL Database、Azure SQL 受控執行個體 以及 SQL Database in Fabric 都支援此模式。
- 查詢 CSV 檔案時,請使用帶有分隔文字檔案格式的外部表格。 SQL Server 2019(15.x)及後續版本、Azure SQL Database、Azure SQL 受控執行個體 以及 SQL Database in Fabric 都支援此模式。
- 對於 Delta Lake 表格的查詢,請使用帶有
FILE_FORMAT = DeltaLakeFileFormat的外部表格。 SQL Server 2022(16.x)及後續版本支援此模式。 - 若要將查詢結果匯出為 Parquet 或 CSV 檔案,請使用
CREATE EXTERNAL TABLE AS SELECT. SQL Server 2022(16.x)及後續版本與 Azure SQL 受控執行個體 支援此模式。
你也可以跟隨以下步驟教學:
| 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 受控執行個體 指南,適用於 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 資料的存取之前,請先使用 在 Windows 上安裝 PolyBase 或 在 Linux 上安裝 PolyBase。
-
- 建立一個資料庫範圍的憑證,並使用目標登入
CREATE DATABASE SCOPED CREDENTIAL,讓引擎能向遠端伺服器進行認證。
- 建立一個資料庫範圍的憑證,並使用目標登入
-
- 使用
CREATE EXTERNAL DATA SOURCE ... WITH (LOCATION = 'sqlserver://<server>')為遠端 SQL Server 建立外部資料來源。
- 使用
-
- 使用
CREATE EXTERNAL TABLE ... WITH (LOCATION = '<db>.<schema>.<table>')來表示遠端資料表,以建立外部資料表。
- 使用
-
- 使用
SELECT * FROM <external_table>查詢外部資料表。
- 使用
小提示
SQL Server 連接器sqlserver://()也適用於 Azure SQL 資料庫和 Azure SQL 受控執行個體。 使用相同的步驟,並設定LOCATION為 Azure SQL Database 或 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) 開始) |
- Oracle 資料來源使用 Configure PolyBase 來存取 Oracle 指南中的外部資料,並需使用 SQL Server 2019(15.x)及更新版本及 Oracle 用戶端驅動程式。
- Teradata 資料來源使用 Configure PolyBase 來存取 Teradata 指南中的外部資料,並需使用 SQL Server 2019(15.x)及更新版本及 Teradata ODBC 驅動程式。
- MongoDB 或 Cosmos DB 資料來源使用配置 PolyBase 來存取 MongoDB 中的外部資料指南,並需使用 SQL Server 2019(15.x)及更新版本及 MongoDB ODBC 驅動程式。
- 任何 ODBC 來源皆可使用 Configure PolyBase 以 ODBC 通用類型指南存取外部資料,且需在 Windows 上使用 SQL Server 2019(15.x)及更新版本,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 儲存體 中的外部資料 |
| SQL Server 2019 (15.x) | 存取金鑰(透過 Hadoop 連接器) | 配置 PolyBase 以存取 Azure Blob 儲存體 中的外部資料 |
| Azure SQL Database | SAS token、Managed Identity、Microsoft Entra pass-through | 使用 Azure SQL 資料庫的資料虛擬化 (預覽版) |
| Azure SQL 受控執行個體 | SAS 代幣,管理身份 | 使用 Azure SQL 受控執行個體的資料虛擬化 |
- SQL Server 2022 及後續版本自 SQL Server 2025(17.x)起,支援使用 Azure Blob 儲存體 或 ADLS Gen2 認證,使用 SAS 憑證、存取金鑰或管理身份驗證。 欲了解更多資訊,請參閱 「配置 PolyBase 以存取 Azure Blob 儲存中的外部資料」。
- SQL Server 2019 支援 Azure Blob 儲存體 或 ADLS Gen2,透過 Hadoop 連接器使用存取金鑰。 欲了解更多資訊,請參閱 「配置 PolyBase 以存取 Azure Blob 儲存中的外部資料」。
- Azure SQL Database 支援 Azure Blob 儲存體 或 ADLS Gen2,透過 SAS 憑證、管理身份驗證或 Microsoft Entra 直通認證。 如需詳細資訊,請參閱使用 Azure SQL Database 的數據虛擬化(預覽版)。
- Azure SQL 受控執行個體 透過使用 SAS 憑證或 Managed Identity 支援 Azure Blob 儲存體 或 ADLS Gen2。 如需詳細資訊,請參閱使用 Azure SQL 受控執行個體進行資料虛擬化。
在 SQL Server 2022(16.x)中,URI 前綴有所更改。 從 SQL Server 2019(15.x)或更早版本遷移時:
-
Azure Blob 儲存體: change
wasb[s]://toabs:// -
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 儲存體、ADLS Gen2 或相容 S3 的儲存中。
| SQL 平台 | 支援 | 匯出格式 | Notes |
|---|---|---|---|
| SQL Server 2022(16.x)及更新版本。 若要匯出至 ADLS Gen2 並搭配 CETAS,則需使用 SQL Server 2022 CU5 或更新版本。 | 是的 | Parquet,CSV | 需要 伺服器設定:允許 PolyBase 匯出。 |
| Azure SQL 受控執行個體 | 是的 | Parquet,CSV | 預設為停用 |
| Azure SQL Database | No | 沒有 | 無法提供 |
| Fabric 中的 SQL 資料庫 | No | 沒有 | 無法提供 |
- SQL Server 2022 及後續版本支援 CETAS,並能匯出 Parquet 與 CSV 檔案。 伺服器設定:允許 PolyBase 匯出 設定為必要設定。 在 SQL Server 2022 CU5 之前的版本中,無法使用 CETAS 匯出至 ADLS Gen2。
- Azure SQL 受控執行個體 支援 CETAS,並匯出 Parquet 和 CSV 檔案。 預設為停用 指引說明其預設狀態。
- Azure SQL Database 不支援 CETAS。
- Fabric 中的 SQL 資料庫不支援 CETAS。
關於 Transact-SQL 參考,請參見CREATE EXTERNAL TABLE AS 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 儲存體 中 CSV 的外部資料表
此範例適用於所有支援外部資料表(透過 CSV 檔案)的 SQL 平台。
步驟 1:建立資料庫主金鑰(DMK)。 此步驟是必要的,因為憑證儲存了 SAS 令牌秘密。 不過,如果你使用管理身份驗證或 Microsoft Entra 認證,可以跳過這個步驟。
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<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 = '<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 受控執行個體 上運作。
步驟 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 T-SQL 物件及其關係,從認證(資料庫主金鑰、憑證)到資料來源與檔案格式,再到查詢方法(外部資料表、OPENROWSET、 BULK INSERTCETAS)。
- 關於外部資料來源語法,請參見 CREATE EXTERNAL DATA SOURCE。
- 關於外部檔案格式語法,請參見 CREATE EXTERNAL FILE FORMAT。
- 關於外部表格語法,請參見 CREATE EXTERNAL TABLE。
- 關於臨時資料存取語法,請參見 OPENROWSET。
- 關於 CETAS 語法,請參見 CREATE EXTERNAL TABLE AS SELECT (CETAS)。
所有物件的完整 Transact-SQL 參考,請參見 PolyBase Transact-SQL 參考。
這很重要
檢查你外部檔案格式的資料型別映射。 當你建立外部檔案格式或使用 OPENROWSET查詢檔案時,PolyBase 會自動將原始資料型態(Parquet、CSV、Delta、Oracle、Teradata、MongoDB)對應到 SQL Server 的資料型別。 類型不匹配可能導致靜默截斷、精度損失或查詢錯誤。 例如,一個 Parquet DECIMAL(38,18) 映射到 DECIMAL(18,0)。 在定義外部資料表的欄位或子句 WITH 之前,請先檢視映射表。 完整參考請參見 PolyBase 的類型映射。
什麼時候需要 CREATE MASTER KEY?
資料庫主鍵(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 - SAS 憑證憑證使用
IDENTITY = 'SHARED ACCESS SIGNATURE'並儲存一個秘密值,因此需要資料庫主金鑰。 - S3 存取金鑰憑證使用
IDENTITY = 'S3 ACCESS KEY'並儲存一個秘密值,因此需要資料庫主金鑰。- SQL 登入或基本認證憑證會使用
IDENTITY = '<username>'並儲存一個秘密值,因此需要資料庫主金鑰。
- SQL 登入或基本認證憑證會使用
- 儲存帳號存取金鑰憑證會使用
IDENTITY = '<storage_account_name>'並儲存一個秘密值,因此需要資料庫的主金鑰。
- SAS 憑證憑證使用
DMK 不強制 (不儲存秘密資料):
驗證類型 IDENTITY值有秘密 DMK 受控識別 'Managed Identity'No 非必要 Microsoft Entra ID 'User Identity'或'Managed Identity'No 非必要 - 管理身份憑證不使用
IDENTITY = 'Managed Identity'並儲存任何秘密,因此不需要資料庫主金鑰。 - Microsoft Entra ID 的憑證不使用
IDENTITY = 'User Identity'或IDENTITY = 'Managed Identity'儲存任何秘密,因此不需要資料庫主金鑰。
- 管理身份憑證不使用
小提示
如果你的 CREATE DATABASE SCOPED CREDENTIAL 陳述式不包含祕密,就不需要 DMK。 管理身份(Managed Identity)與 Microsoft Entra ID 認證將信任委派給平台。 資料庫不會儲存密碼或令牌。
範例:
在這個範例查詢中,DMK 是必要的(憑證儲存 SAS 令牌)。
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<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(所有支援版本) |
| SQL Server 2022(16.x)與 SQL Server 2019(15.x)中的檔案查詢 | OPENROWSET(BULK ...) |
本地磁碟、網路或雲端上的檔案(Azure Blob、ADLS、S3、OneLake) | SAS 令牌、存取金鑰、管理身份、Microsoft Entra ID | 雲端 1 為是;本地為否 | SQL Server 2022 (16.x) 與 SQL Server 2019 (15.x) |
| SQL Server 2025(17.x)及後續版本中的檔案查詢 | OPENROWSET(BULK ...) |
本地磁碟、網路或雲端上的檔案(Azure Blob、ADLS、S3、OneLake) | SAS 令牌、存取金鑰、管理身份、Microsoft Entra ID | No | SQL Server 2022 (16.x) 及以後版本、Azure SQL 資料庫、Azure SQL 受控執行個體、Fabric 中的 SQL 資料庫 |
| PolyBase 連接器 |
CREATE EXTERNAL TABLE 和 CREATE 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) |
1 若要在 SQL Server 2022(16.x)中存取雲端檔案,必須安裝 PolyBase 功能。
- 在所有支援的 SQL Server 版本中,OLE DB 查詢會使用
OPENROWSET(provider, connection, query),透過 MSOLEDBSQL、SQLOLEDB 或其他提供者連線到任何 OLE DB 來源。 它們支援 SQL 驗證、Windows 驗證,以及搭配 MSOLEDBSQL 的 Microsoft Entra ID,而且不需要安裝 PolyBase 服務。 - 檔案查詢用於
OPENROWSET(BULK ...)讀取本地磁碟、網路共享或雲端儲存(如 Azure Blob 儲存體、ADLS、S3 或 OneLake)上的檔案,方法是使用 SAS 標記、存取金鑰、管理身份碼或 Microsoft Entra ID。 它們支援 SQL Server 2005 及以後版本的本地與網路檔案,SQL Server 2022(16.x)及以後版本的雲端檔案,以及 Azure SQL Database、Azure SQL 受控執行個體 和 Fabric 中的 SQL 資料庫。 在 SQL Server 2022(16.x)及更新版本中,檔案查詢不需要 PolyBase 服務來處理本地檔案或雲端檔案。 - PolyBase 連接器使用
CREATE EXTERNAL TABLE搭配CREATE EXTERNAL DATA SOURCE以及sqlserver://、oracle://、teradata://、mongodb://或odbc://位置,以連線到遠端的 SQL Server、Oracle、Teradata、MongoDB 或 ODBC 來源。 它們需要 SQL 驗證和 PolyBase 服務;在 Windows 上需使用 SQL Server 2019 (15.x) 及更新版本,在 Linux 上則需使用 SQL Server 2025 (17.x) 及更新版本。 欲了解更多資訊,請參見 CREATE EXTERNAL DATA SOURCE (Transact-SQL)。
何時使用每種方法
使用 OLE DB OPENROWSET 用於:
- 使用 OLE DB
OPENROWSET進行快速且一次性的臨時查詢,無需建立持久物件。 - 使用 OLE DB
OPENROWSET來進行 Microsoft Entra ID 或透過 MSOLEDBSQL 的受管理身份驗證。 - 使用 OLE DB
OPENROWSET以避免 PolyBase 服務依賴。 - 使用 OLE DB
OPENROWSET連接任何有 OLE DB 提供者的資料來源。
使用 檔案 OPENROWSET(BULK) 來:
- 使用檔案
OPENROWSET(BULK ...)來臨時探索檔案和結構。 - 在你承諾資料表定義前,請使用檔案
OPENROWSET(BULK ...)來快速轉換和預覽。 - 使用檔案
OPENROWSET(BULK ...)進行彈性的內嵌欄位轉換,如投射、篩選及計算欄位。 - 使用
OPENROWSET(BULK ...)檔案來存放不常變動且不需要持久元資料的資料。
將 PolyBase 連接器與 CREATE EXTERNAL TABLE 搭配使用於:
- 使用 PolyBase 連接器
CREATE EXTERNAL TABLE,提供多個使用者或應用程式存取的持久且可重複使用的表格定義。 - 針對需要統計資料和查詢計畫最佳化的生產環境工作負載,請使用搭配
CREATE EXTERNAL TABLE的 PolyBase 連接器。 - 使用 PolyBase 連接器,將
CREATE EXTERNAL TABLE計算推送至遠端來源如 Oracle 和 SQL Server。 - 搭配
CREATE EXTERNAL TABLE使用 PolyBase 連接器,以實現共享治理和安全性;資料表建立後,使用者只需要有SELECT權限。 - 當可對遠端來源使用 SQL 驗證時,請使用含有
CREATE EXTERNAL TABLE的 PolyBase 連接器。
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 儲存體(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 OPERATIONS或ADMINISTER DATABASE BULK OPERATIONS |
一旦建立,桌面上的標準 SELECT 權限就足夠了 |
| 計算欄位 | 是的。 在列表中新增表達式和計算欄位 SELECT ;像 filename() 和 filepath() 這樣的元資料函式僅在此可用。 |
否。 固定欄位列表;在檢視或讀取外部資料表的查詢中執行轉換 |
| 統計資料 | Azure SQL 受控執行個體:透過sys.sp_create_openrowset_statistics手動單欄統計。 請參閱 OPENROWSET 手冊統計資料。 SQL Server 2022 (16.x) 及後續版本,Azure SQL Database、Fabric 中的 SQL 資料庫:自動建立 predicate 的統計。 SQL Server 不支援手動 OPENROWSET統計。 |
所有平台皆完全支援 CREATE STATISTICS,且在 SQL Server 2022(16.x)及更新版本中提供自動建立功能。 請參閱 手動建立外部表統計資料。 |
| 下壓 | 支援有限。 引擎可能會將過濾器推送到檔案掃描,但不會推送到遠端的 RDBMS 來源 | 是的。 支援 RDBMS 連接器(SQL Server、Oracle、Teradata、MongoDB)的推送計算 |
| 適用對象 | 資料探索、結構發現、查詢原型、一次性資料載入、靈活轉換 | 生產工作負載、重複查詢、跨使用者共享存取、儀表板與報告 |
-
OPENROWSET(BULK ...)最適合臨時探索與一次性查詢,而外部資料表則較適合持久且可重複使用的資料表定義。 -
OPENROWSET(BULK ...)查詢執行後不會將中繼資料儲存在資料庫中,而外部資料表則以資料庫物件形式儲存資料表定義、資料來源及檔案格式。 -
OPENROWSET(BULK ...)會自動從 Parquet 檔案推斷結構描述,或透過內嵌的WITH子句定義結構描述,而外部資料表則會在CREATE EXTERNAL TABLE陳述式中明確定義結構描述。 -
OPENROWSET(BULK ...)需要ADMINISTER BULK OPERATIONS或ADMINISTER DATABASE BULK OPERATIONS,而外部資料表在建立後,僅需具備標準SELECT權限的使用者即可查詢。 -
OPENROWSET(BULK ...)支援查詢函式中的計算欄位,並支援元資料函式,如filename()和filepath(),而外部資料表則有固定欄位列表,且需要在檢視或讀取外部資料表的查詢中進行轉換。 -
OPENROWSET(BULK ...)對統計資料的支援有限:Azure SQL 受控執行個體 可將sys.sp_create_openrowset_statistics用於單一資料行統計資料,但 SQL Server 2022 (16.x) 和更新版本、Azure SQL Database,以及 Fabric 中的 SQL 資料庫會自動在述詞上建立統計資料。 SQL Server、Azure SQL Database 以及 Fabric 中的 SQL 資料庫都不支援手動OPENROWSET統計。 外部資料表支援所有平台的完整CREATE STATISTICS功能,並在 SQL Server 2022(16.x)及更新版本、Azure SQL Database 及 Fabric 中的 SQL 資料庫中自動統計。 請參閱 OPENROWSET 手動統計 資料及 建立外部表格手動統計資料。 -
OPENROWSET(BULK ...)僅支援有限的下推,且不支援對遠端 RDBMS 來源進行下推;而外部資料表則支援 RDBMS 連接器的下推運算。 -
OPENROWSET(BULK ...)最適合資料探索、結構發現、原型設計、一次性載入及靈活轉換,而外部資料表則最適合生產工作負載、重複查詢、共享存取、儀表板及報告。
需要彈性時使用 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 資料庫中不被支援。 若要擷取資料,請使用 INSERT ... SELECT 搭配 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條款包括對BATCHSIZE、CHECK_CONSTRAINTS、FIRE_TRIGGERS、KEEPIDENTITY、KEEPNULLS、TABLOCK及其他的支持。 |
透過 INSERT ... SELECT * FROM OPENROWSET(BULK ...) WITH (TABLOCK, IGNORE_CONSTRAINTS, ...) 語法支援表格提示功能 |
| 大型物件(LOB)單一值匯入 | 不支援 | 是的。 支援 SINGLE_BLOB、 SINGLE_CLOB,SINGLE_NCLOB將整個檔案匯入為一個 varbinary(max)、varchar(max) 或 nvarchar(max) 值 |
| 格式化檔案 | 是的。 支援方式(XML 與非 XML) | 是的。 支援(XML 與非 XML) |
| 雲端檔案存取 |
DATA_SOURCE 支援 SQL Server 2017(14.x)和更新版本中的 Azure Blob 儲存體、Azure SQL Database,以及 Azure SQL 受控執行個體。 SQL Server 2019 CU11 及之後的更新也支援 ADLS Gen2。 不支援支援 S3 的儲存裝置。 |
DATA_SOURCE支援 SQL Server 2017(14.x)及後版本的 Azure Blob 儲存體,SQL Server 2019 CU11 及以上版本支援 ADLS Gen2,以及 SQL Server 2022(16.x)及後續版本的 S3 相容儲存。 Azure SQL Database 同 Azure SQL 受控執行個體 支持 Azure Blob 儲存體 同 ADLS Gen2. Fabric 中的 SQL 資料庫支援 OneLake 及透過 OneLake 捷徑的外部儲存。 |
| Parquet或Delta文件 | 不支援。 僅限 CSV/定界文字 | 是的。 SQL Server 2022(16.x)及更新版本,支援 Azure SQL 受控執行個體 和 Azure SQL Database;FORMAT = 'PARQUET'FORMAT = 'DELTA'Fabric 中的 SQL 資料庫支援FORMAT = 'PARQUET',但不支援DELTA。 如需詳細資訊,請參閱 OPENROWSET BULK (Transact-SQL)。 |
| 所需權限 |
ADMINISTER BULK OPERATIONS 或 ADMINISTER DATABASE BULK OPERATIONS,以及目標表上的 INSERT |
ADMINISTER BULK OPERATIONS 或 ADMINISTER DATABASE BULK OPERATIONS |
| 最小記錄 | 是的。 支援於簡單或批量記錄的復原模型中,且 TABLOCK |
是的。 與INSERT ... SELECT和TABLOCK一起使用時受支持 |
-
BULK INSERT直接從檔案將資料載入目標資料表,而OPENROWSET(BULK ...)會傳回可在INSERT ... SELECT或SELECT陳述式中使用的資料列集。 -
BULK INSERT是獨立陳述式,而OPENROWSET(BULK ...)必須在查詢中使用,例如SELECT * FROM OPENROWSET(BULK ...)INSERT INTO <table> SELECT * FROM OPENROWSET(BULK ...)或。 -
BULK INSERT總是直接寫入目標資料表,而OPENROWSET(BULK ...)可以SELECT從檔案寫入,無需插入任何地方,也無法插入任何資料表或暫存資料表。 -
BULK INSERT對欄位轉換的支援有限,因為資料是從檔案流到資料表 as-is,映射則由格式檔或欄位順序控制。OPENROWSET(BULK ...)支援運算式、CAST、JOIN篩選器、SELECT,以及周圍的WHERE中的計算資料行。 -
BULK INSERT使用WITH子句來表示BATCHSIZE、CHECK_CONSTRAINTS、KEEPNULLS、FIRE_TRIGGERS、KEEPIDENTITY、TABLOCK以及其他提示。OPENROWSET(BULK ...)透過INSERT ... SELECT * FROM OPENROWSET(BULK ...) WITH (TABLOCK, IGNORE_CONSTRAINTS, ...)支援資料表提示。 -
BULK INSERT不支援大型物件的單一值匯入。OPENROWSET(BULK ...)支援SINGLE_BLOB、SINGLE_CLOB和SINGLE_NCLOB,可分別將整個檔案匯入為單一 varbinary(max)、varchar(max) 或 nvarchar(max) 值。 - 兩者皆
BULK INSERTOPENROWSET(BULK ...)支援 XML 及非 XML 格式檔案。 - 對於雲端檔案存取,
DATA_SOURCE參數BULK INSERT支援SQL Server 2017(14.x)及後版本的Azure SQL Database和Azure SQL 受控執行個體中的Azure Blob 儲存體。 SQL Server 2019 CU11 及後續更新也支援 ADLS Gen2,但BULK INSERT不支援 S3 相容的儲存。 對於OPENROWSET(BULK ...),DATA_SOURCE支援 SQL Server 2017(14.x)及更新版本中的 Azure Blob 儲存體,SQL Server 2019 CU11 及以上版本支援 ADLS Gen2,以及 SQL Server 2022(16.x)及以上版本中支援 S3 相容的儲存。 Azure SQL Database 同 Azure SQL 受控執行個體 支持 Azure Blob 儲存體 同 ADLS Gen2. Fabric 中的 SQL 資料庫支援 OneLake 及透過 OneLake 捷徑的外部儲存。 -
BULK INSERT不支援 Parquet 或 Delta 檔案,僅支援 CSV 或分隔文字。OPENROWSET(BULK ...)支援在 SQL Server 2022(16.x)及更新版本、Azure SQL Database 和 Azure SQL 受控執行個體 中使用FORMAT = 'PARQUET'和FORMAT = 'DELTA'。 Fabric 中的 SQL 資料庫支援FORMAT = 'DELTA',但不支援FORMAT = 'PARQUET'。 如需詳細資訊,請參閱 OPENROWSET BULK (Transact-SQL)。 -
BULK INSERT需要ADMINISTER BULK OPERATIONS或ADMINISTER DATABASE BULK OPERATIONS加上INSERT目標表上的許可,而OPENROWSET(BULK ...)則要求ADMINISTER BULK OPERATIONS或ADMINISTER DATABASE BULK OPERATIONS。 -
BULK INSERT在簡單復原模式或大量記錄復原模式下搭配TABLOCK時,支援最少記錄。OPENROWSET(BULK ...)與INSERT ... SELECT和TABLOCK一起使用時,支援最少記錄。
何時應選擇 BULK INSERT
當你有直接的檔案到表格載入,且匯入時不需要轉換、篩選或合併資料時使用 BULK INSERT 。 它對 CSV 或其他分隔檔案使用較簡單的語法:
這個範例查詢會直接從 Azure Blob 儲存體 載入 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 ...) :
- 使用
OPENROWSET(BULK ...)來查詢或預覽檔案資料,無需先建立資料表。 - 使用
OPENROWSET(BULK ...)在匯入時轉換、篩選或合併資料。 - 用
OPENROWSET(BULK ...)來載入 Parquet 或 Delta 檔案,因為它們BULK INSERT不支援這些格式。 - 使用
OPENROWSET(BULK ...)搭配SINGLE_CLOB、SINGLE_NCLOB或SINGLE_BLOB,將整個檔案匯入為單一 LOB 值。
這個範例查詢是預覽 Azure Blob 儲存體 的 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。
欲了解更多資訊,請參閱以下相關指南:
- 「使用 BULK INSERT 或 OPENROWSET(BULK...) 將資料匯入 SQL Server」一文提供了含安全性考量的詳細對照指南。
- 《大量資料匯入與匯出(SQL Server)》文章概述了所有大量資料移動方法,包括 bcp 、
BULK INSERT及OPENROWSET。 -
BULK INSERT (Transact-SQL) 文章提供了完整的 T-SQL 參考資料
BULK INSERT。 -
OPENROWSET BULK (Transact-SQL) 文章提供了完整的 T-SQL 參考資料
OPENROWSET(BULK ...)。 - 《Azure Blob 儲存體 中大量存取資料的範例》文章提供了並排範例,說明兩者在 Azure 儲存體 中都使用了兩種方法。
- 《使用 OPENROWSET Bulk Rowset Provider (SQL Server) 大量匯入大型物件資料》文章提供
SINGLE_BLOB、SINGLE_CLOB和SINGLE_NCLOB範例。 -
《使用格式檔大量匯入資料 (SQL Server)》一文說明這兩種方法中格式檔的使用方式。
- 關於在大量匯入時保留空值或套用預設值的指引,請參見「在大量匯入時保留空值或預設值(SQL Server)」。
- 關於在批量匯入時保留身份值的指引,請參閱《在大量匯入資料時保留身份值(SQL Server)》。
有用的元資料功能
當你透過外部 OPENROWSET 資料表查詢外部檔案時,請利用內建函式和程序檢查檔案中繼資料、發現結構,並實作分區感知查詢。
filepath() 與 filename()
filepath() 函數和 filename() 函數會針對結果集中的每一列,回傳檔案路徑的部分或檔案名稱。 它們特別適合以下用途:
分割區消除:在資料夾區段(例如年份/月份/日分割區)上進行過濾,讓引擎只讀取匹配的檔案,而非掃描所有檔案。
揭露原始元資料:在查詢結果中將原始檔名或路徑作為欄位,這對於稽核或除錯非常有幫助。
| 功能 | 退貨 | 範例 |
|---|---|---|
filename() |
每一列的原始檔案名稱(含副檔名) | sales_2025_01.parquet |
filepath(N) |
路徑中通配符()*的BULK個資料夾段,其中 N 從 1 開始 |
對於路徑 sales/2025/01/*.parquet,返回 filepath(1)2025, filepath(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 Database、Azure SQL 受控執行個體 及 Fabric 中 SQL 資料庫的通用程序,但對於 OPENROWSET 查詢特別有用。 欲了解更多資訊,請參見 sp_describe_first_result_set。
效能、故障排除與最佳實務
實施資料虛擬化後,請參考以下指南優化效能、診斷問題並確保生產準備狀態:
| 適用範圍 | 發行項 | 詳細資料 |
|---|---|---|
| PolyBase 效能 | PolyBase 中適用於 SQL Server 的效能考量 | 統計、推下、平行處理與記憶體管理 |
| 下推計算 | PolyBase 中的下推計算 | 指定哪些操作要推送到遠端來源 |
| 如何判斷是否發生了下壓 | 如何判斷是否發生外部下推 | 查詢計畫與動態管理檢視(DMV) |
| Troubleshooting | 監視 PolyBase 並進行疑難排解 | 常見錯誤和解決方案 |
| Kerberos 連接性 | 排解 PolyBase Kerberos 連線問題 | |
| 常見問題集 | PolyBase常見問題 | |
| 錯誤與解法 | PolyBase 錯誤和可能的解決方案 |