共用方式為


OPENROWSET BULK (Transact-SQL)

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控實例

OPENROWSET T-SQL 命令包含從外部數據來源存取遠端資料所需的所有連接資訊。 OPENROWSET 也支援透過內建 BULK 提供者進行大量作業,讓檔案中的數據能夠以數據列集的形式讀取和傳回。 OPENROWSET BULK 用於從外部數據檔讀取, OPENROWSET 而不需要大量讀取另一個資料庫引擎。

OPENROWSET 式可以在查詢的 子句中 FROM 參考,就像是數據表名稱一樣。 函OPENROWSET式也可以參考為、 INSERTUPDATE 語句的目標DELETE,但受限於數據提供者的功能。 雖然查詢可能會傳回多個結果集,但 OPENROWSET 只會傳回第一個結果集。

OPENROWSET BULK若沒有 運算符,則僅適用於 SQL Server,如需詳細資訊,請參閱 OPENROWSET (Transact-SQL)。

其他平台上類似範例的詳細數據和連結:

Transact-SQL 語法慣例

語法

OPENROWSET(BULK) 語法是用來讀取外部檔案:

OPENROWSET( BULK 'data_file' ,
            { FORMATFILE = 'format_file_path' [ <bulk_options> ]
              | SINGLE_BLOB | SINGLE_CLOB | SINGLE_NCLOB }
)

<bulk_options> ::=
   [ , DATA_SOURCE = 'data_source_name' ]

   -- bulk_options related to input file format
   [ , CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' } ]
   [ , FORMAT = { 'CSV' | 'PARQUET' | 'DELTA' } ]
   [ , FIELDQUOTE = 'quote_character' ]
   [ , FORMATFILE = 'format_file_path' ]
   [ , FORMATFILE_DATA_SOURCE = 'data_source_name' ]

   [ , FIRSTROW = first_row ]
   [ , LASTROW = last_row ]

   [ , MAXERRORS = maximum_errors ]
   [ , ERRORFILE = 'file_name' ]
   [ , ERRORFILE_DATA_SOURCE = 'data_source_name' ]

   [ , ROWS_PER_BATCH = rows_per_batch ]
   [ , ORDER ( { column [ ASC | DESC ] } [ , ...n ] ) [ UNIQUE ] ]

論點

BULK 自變數

使用的數據 BULK 列集提供者 OPENROWSET ,從檔案讀取數據。 在 SQL Server 中, OPENROWSET 可以從數據檔讀取數據,而不需要將數據載入目標數據表。 這可讓您搭配基本OPENROWSET語句使用SELECT

選項的 BULK 自變數可大幅控制開始和結束讀取數據的位置、如何處理錯誤,以及如何解譯數據。 例如,您可以指定數據檔讀取為 varbinaryvarchar 或 nvarchar 類型的單一數據列、單一數據行數據列集。 預設行為將在接下來的引數描述中加以描述。

如需如何使用 BULK 選項的詳細資訊,請參閱本文稍後的<備註>一節。 如需選項所需許可權 BULK 的相關信息,請參閱 本文稍後的<許可權 >一節。

備註

使用 完整恢復模式匯入數據時, OPENROWSET (BULK ...) 不會優化記錄。

如需準備大容量導入數據的資訊,請參閱 準備大容量匯出或匯入的數據。

BULK 'data_file'

要複製到目標數據表之數據檔的完整路徑。

SELECT * FROM OPENROWSET(
   BULK 'C:\DATA\inv-2017-01-19.csv',
   SINGLE_CLOB
) AS DATA;

從 SQL Server 2017 (14.x) 開始,data_file 可位於 Azure Blob 儲存體中。 如需範例,請參閱大量存取 Azure Blob 儲存體 中的數據範例。

BULK 錯誤處理選項

ERRORFILE = 'file_name'

指定用來收集格式錯誤且無法轉換成 OLE DB 資料列集之資料列的檔案。 這些資料列會「依照原狀」,從資料檔複製到這個錯誤檔中。

錯誤檔是在開始執行命令時建立。 如果檔案已經存在,就會引發錯誤。 另外,還會建立一個副檔名為 .ERROR.txt 的控制檔。 這個檔案會參考錯誤檔中的每個資料列,且會提供錯誤診斷。 更正錯誤之後,即可載入數據。

從 SQL Server 2017 (14.x) 開始,error_file_path 可位於 Azure Blob 儲存體中。

ERRORFILE_DATA_SOURCE_NAME

從 SQL Server 2017 (14.x) 開始,這個自變數是一個具名的外部數據源,指向錯誤檔案的 Azure Blob 記憶體位置,其中包含匯入期間發現的錯誤。 必須使用 建立 TYPE = BLOB_STORAGE外部數據源。 如需詳細資訊,請參閱 CREATE EXTERNAL DATA SOURCE (Transact-SQL)。

MAXERRORS = maximum_errors

指定語法錯誤或不符合格式數據列的數目上限,如格式檔案中所定義,這可能會在擲回例外狀況之前 OPENROWSET 發生。 直到 MAXERRORS 到達為止, OPENROWSET 會忽略每個不正確的數據列,而不是載入它,並將不正確的數據列計算為一個錯誤。

maximum_errors 的預設值為 10。

備註

MAX_ERRORS 不適用於 CHECK 條件約束,或轉換 moneybigint 數據類型。

BULK 數據處理選項

DATA_SOURCE

DATA_SOURCE 是使用 CREATE EXTERNAL DATA SOURCE 建立的外部位置。

FIRSTROW = first_row

指定要載入之第一個資料列的號碼。 預設值為 1。 這表示指定之資料檔中的第一個資料列。 資料列號碼是由計算資料列結束字元所決定。 FIRSTROW 是以1為基礎。

LASTROW = last_row

指定要載入之最後一個資料列的號碼。 預設值為 0。 這表示指定的資料檔中的最後一個資料列。

ROWS_PER_BATCH = rows_per_batch

指定資料檔案中資料列的近似數目。 這個值應該與實際的資料列數差不多。

OPENROWSET 一律將資料檔案當作單一批次加以匯入。 不過,如果您為 rows_per_batch 指定 > 0 的值,查詢處理器會使用 rows_per_batch 的值作為提示,以在查詢計劃中配置資源。

ROWS_PER_BATCH預設為未知。 指定 ROWS_PER_BATCH = 0 與省略 ROWS_PER_BATCH相同。

ORDER ( { column [ ASC |DESC ] } [ ,... n ] [ UNIQUE ]

選擇性提示,指定如何排序數據檔中的數據。 依預設,大量作業會假設資料檔沒有排序。 如果查詢優化器可以利用順序來產生更有效率的查詢計劃,效能可能會改善。 下列清單提供指定排序可能很有説明的範例:

  • 將資料列插入具有叢集索引的資料表中,其中的資料列集資料會根據叢集索引鍵來排序。
  • 將資料列集與另一個資料表聯結,其中的排序資料行和聯結資料行會相符。
  • 依據排序資料行彙總資料列集資料。
  • 使用數據列集做為查詢子句中的 FROM 源數據表,其中排序和聯結數據行相符。

獨特

指定資料檔案沒有重複的專案。

如果數據檔中的實際數據列未根據指定的順序排序,或 UNIQUE 指定提示且存在重複索引鍵,則會傳回錯誤。

使用 時 ORDER 需要數據行別名。 數據行別名清單必須參考 子句所存取 BULK 的衍生數據表。 子句中指定的 ORDER 數據行名稱會參考此數據行別名清單。 無法指定大型實值類型 (varchar(max)nvarchar(max)varbinary(max)xml) 和大型物件 (LOB) 類型 (textntextimage) 數據行。

SINGLE_BLOB

data_file 的內容當作 varbinary(max) 類型的單一資料列、單一資料行資料列集加以傳回。

這很重要

我們建議您只使用 SINGLE_BLOB 選項匯入 XML 數據,而不是 SINGLE_CLOBSINGLE_NCLOB,因為只 SINGLE_BLOB 支援所有 Windows 編碼轉換。

SINGLE_CLOB

以 ASCII 格式讀取 data_file,並且使用目前資料庫的定序,將內容當做 varchar(max) 類型的單一資料列、單一資料行資料列集加以傳回。

SINGLE_NCLOB

藉由以 Unicode 讀取data_file,使用目前資料庫的定序,以 nvarchar(max) 類型的單一數據列、單一數據行數據列集傳回內容。

SELECT * FROM OPENROWSET(
    BULK N'C:\Text1.txt',
    SINGLE_NCLOB
) AS Document;

BULK 輸入檔案格式選項

CODEPAGE = { 'ACP' |'OEM' |'RAW' |'code_page' }

指定資料檔案中之資料的字碼頁。 CODEPAGE 只有在數據包含 字元值超過 127 或小於 32 的 charvarchartext 數據行時,才會相關。

這很重要

CODEPAGE Linux 上不支持的選項。

備註

除非您希望 65001 選項的優先順序高於定序/字碼頁指定值,否則建議您在格式檔案中指定每個資料行的定序名稱。

CODEPAGE 值 說明
ACP charvarchartext 資料類型的資料行,從 ANSI/Microsoft Windows 字碼頁 (ISO 1252) 轉換成 SQL Server 字碼頁。
OEM (預設值) charvarchartext 資料類型的資料行,從系統 OEM 字碼頁轉換成 SQL Server 字碼頁。
RAW 不進行字碼頁之間的轉換。 這是最快的選項。
code_page 指出在哪一個來源字碼頁,將資料檔中的字元資料加以編碼;例如 850。

SQL Server 2016 (13.x) 之前的重要 版本不支援代碼頁 65001(UTF-8 編碼)。

FORMAT = { 'CSV' |'PARQUET' |'DELTA' }

從 SQL Server 2017 (14.x)開始,此自變數會指定符合 RFC 4180 標準的逗號分隔值檔案。

從 SQL Server 2022 (16.x)開始,支援 Parquet 和 Delta 格式。

SELECT *
FROM OPENROWSET(BULK N'D:\XChange\test-csv.csv',
    FORMATFILE = N'D:\XChange\test-csv.fmt',
    FIRSTROW=2,
    FORMAT='CSV') AS cars;

FORMATFILE = 'format_file_path'

指定格式檔的完整路徑。 SQL Server 支援兩種類型的格式檔案:XML 和非 XML。

您必須使用格式檔,才能定義結果集中的資料行類型。 唯一的例外狀況是指定 、 SINGLE_CLOBSINGLE_BLOBSINGLE_NCLOB,在此情況下,不需要格式檔案。

如需格式檔案的相關信息,請參閱 使用格式檔案大容量導入資料 (SQL Server)

從 SQL Server 2017 (14.x) 開始,format_file_path可以在 Azure Blob 儲存體 中。 如需範例,請參閱大量存取 Azure Blob 儲存體 中的數據範例。

FIELDQUOTE = 'field_quote'

從 SQL Server 2017 (14.x)開始,這個自變數會指定 CSV 檔案中做為引號字元的字元。 如果未指定,則會使用引號字元 (") 作為 RFC 4180 標準中所定義的引號字元。 只能將單一字元指定為此選項的值。

備註

OPENROWSET 只有當指定提供者的 DisallowAdhocAccess 登錄選項明確設定為 0 ,且已啟用臨機作分散式查詢進階組態選項時,才能從 OLE DB 數據源存取遠端數據。 如果未設定這些選項,預設行為不允許臨機操作存取。

當您存取遠端 OLE DB 數據源時,信任連線的登入身分識別不會從用戶端連線到所查詢伺服器的伺服器上自動委派。 此時必須設定驗證委派。

如果資料提供者支援指定數據來源中的多個目錄和架構,則需要目錄和架構名稱。 catalog當數據提供者不支援 和 schema 的值時,可以省略 和的值。 如果提供者只支援架構名稱,則必須指定表單 schema.object 的兩部分名稱。 如果提供者只支援目錄名稱,則必須指定表單 catalog.schema.object 的三部分名稱。 如需詳細資訊,請參閱 Transact-SQL 語法慣例

您必須為使用 SQL Server Native Client OLE DB 提供者的傳遞查詢指定三部分的名稱。

OPENROWSET 不接受其自變數的變數。

OPENDATASOURCE 子句中 OPENQUERYOPENROWSETFROM 的任何呼叫都會與當做更新目標使用之這些函數的任何呼叫進行個別且獨立的評估,即使完全相同的引數套用至這兩種呼叫也一樣。 尤其,針對其中一個呼叫結果所套用的篩選或聯結條件對於另一個呼叫的結果沒有作用。

搭配 BULK 選項使用 OPENROWSET

下列 Transact-SQL 增強功能支援 函式 OPENROWSET(BULK...)

  • FROM搭配 SELECT 使用的 子句可以呼叫 OPENROWSET(BULK...) ,而不是具有完整SELECT功能的數據表名稱。

    具有 OPENROWSET 選項的 BULKFROM 子句中需要一個相互關聯名稱,又稱為範圍變數或別名。 您可以指定資料行別名。 如果未指定數據行別名清單,格式檔案必須具有數據行名稱。 指定資料行別名會覆寫格式檔中的資料行名稱,例如:

    • FROM OPENROWSET(BULK...) AS table_alias
    • FROM OPENROWSET(BULK...) AS table_alias(column_alias,...n)

    這很重要

    新增 AS <table_alias> 失敗將會導致錯誤:訊息 491,層級 16,狀態 1,行 20 必須為 FROM 子句中的大量資料列集指定相互關聯名稱。

  • SELECT...FROM OPENROWSET(BULK...) 陳述式會直接查詢檔案中的資料,而不將資料匯入資料表中。 SELECT...FROM OPENROWSET(BULK...) 陳述式也可以使用格式檔案來指定資料行名稱和資料類型,以列出大量資料行別名。

  • 使用 OPENROWSET(BULK...) 作為 INSERTMERGE 陳述式中的來源資料表會將資料檔案中的資料大量匯入至 SQL Server 資料表中。 如需詳細資訊,請參閱 使用 BULK INSERT 或 OPENROWSET(BULK...) 將數據匯入 SQL Server

  • OPENROWSET BULK當 選項與語句搭配INSERT使用時,BULK子句支持數據表提示。 除了一般的資料表提示 (例如 TABLOCK) 之外,BULK 子句也接受下列特殊化資料表提示:IGNORE_CONSTRAINTS (僅忽略 CHECKFOREIGN KEY 限制式)、IGNORE_TRIGGERSKEEPDEFAULTSKEEPIDENTITY。 如需詳細資訊,請參閱資料表提示 (Transact-SQL)

    如需如何使用 INSERT...SELECT * FROM OPENROWSET(BULK...) 陳述式的資訊,請參閱資料的大量匯入及匯出 (SQL Server)。 如需了解大量匯入作業中執行的資料列插入發生時如何記錄到交易記錄的資訊,請參閱大量匯入採用最低限度記錄的必要條件

備註

當您使用 OPENROWSET時,請務必瞭解 SQL Server 如何處理模擬。 如需安全性考慮的相關信息,請參閱 使用 BULK INSERT 或 OPENROWSET(BULK...) 將數據匯入 SQL Server

大容量導入 SQLCHAR、SQLNCHAR 或 SQLBINARY 數據

OPENROWSET(BULK...)假設如果未指定,則 、 或 SQLCHAR 數據的最大長度SQLNCHARSQLBINARY不會超過 8,000 個字節。 如果要匯入的數據位於包含任何 varchar(max)、nvarchar(max)varbinary(max) 對象超過 8,000 個字節的 LOB 數據欄位中,您必須使用 XML 格式檔案來定義數據欄位的最大長度。 若要指定最大長度,請編輯格式檔案,並宣告 MAX_LENGTH 屬性。

備註

自動產生的格式檔案不會指定 LOB 字段的長度或長度上限。 但是,您可以編輯格式檔案,並手動指定長度或最大長度。

大量匯出或是匯入 SQLXML 文件

若要大量匯出或匯入 SQLXML 資料,請在格式檔案中使用下列其中一種資料類型。

數據類型 影響
SQLCHARSQLVARYCHAR 數據會在用戶端代碼頁或定序所隱含的代碼頁中傳送。
SQLNCHARSQLNVARCHAR 以 Unicode 格式傳送這份資料。
SQLBINARYSQLVARYBIN 資料被傳送時未經任何轉換。

權限

OPENROWSET 許可權是由傳遞至數據提供者的用戶名稱許可權所決定。 若要使用 BULK 選項,需要 ADMINISTER BULK OPERATIONSADMINISTER DATABASE BULK OPERATIONS 權限。

範例

本節提供一般範例來示範如何使用 OPENROWSET BULK 語法。

A。 使用 OPENROWSET 將檔案資料大量插入 varbinary(max) 數據行

適用於: 僅限 SQL Server。

下列範例會建立小型數據表以供示範之用,並將位於根目錄中之檔案Text1.txtC:檔案數據插入 varbinary(max) 資料行。

CREATE TABLE myTable (
    FileName NVARCHAR(60),
    FileType NVARCHAR(60),
    Document VARBINARY(MAX)
);
GO

INSERT INTO myTable (
    FileName,
    FileType,
    Document
)
SELECT 'Text1.txt' AS FileName,
    '.txt' AS FileType,
    *
FROM OPENROWSET(
    BULK N'C:\Text1.txt',
    SINGLE_BLOB
) AS Document;
GO

B. 使用 OPENROWSET BULK 提供者搭配格式檔案,從文本檔擷取數據列

適用於: 僅限 SQL Server。

下列範例會利用一個格式檔,從 Tab 鍵分隔的文字檔 values.txt 擷取資料列,該檔含有下列資料:

1     Data Item 1
2     Data Item 2
3     Data Item 3

格式檔 values.fmt 會描述 values.txt 中的資料行:

9.0
2
1  SQLCHAR  0  10 "\t"    1  ID           SQL_Latin1_General_Cp437_BIN
2  SQLCHAR  0  40 "\r\n"  2  Description  SQL_Latin1_General_Cp437_BIN

此查詢會擷取該資料:

SELECT a.* FROM OPENROWSET(
    BULK 'C:\test\values.txt',
   FORMATFILE = 'C:\test\values.fmt'
) AS a;

C. 指定格式檔案和代碼頁

適用於: 僅限 SQL Server。

下列範例示範如何同時使用格式檔案和代碼頁選項。

INSERT INTO MyTable
SELECT a.* FROM OPENROWSET (
    BULK N'D:\data.csv',
    FORMATFILE = 'D:\format_no_collation.txt',
    CODEPAGE = '65001'
) AS a;

D. 使用格式檔案從 CSV 檔案存取數據

適用於: 僅限 SQL Server 2017 (14.x) 和更新版本。

SELECT * FROM OPENROWSET(
    BULK N'D:\XChange\test-csv.csv',
    FORMATFILE = N'D:\XChange\test-csv.fmt',
    FIRSTROW = 2,
    FORMAT = 'CSV'
) AS cars;

E. 從沒有格式檔案的 CSV 檔案存取數據

適用於: 僅限 SQL Server。

SELECT * FROM OPENROWSET(
   BULK 'C:\Program Files\Microsoft SQL Server\MSSQL14.CTP1_1\MSSQL\DATA\inv-2017-01-19.csv',
   SINGLE_CLOB
) AS DATA;
SELECT *
FROM OPENROWSET('MSDASQL',
    'Driver={Microsoft Access Text Driver (*.txt, *.csv)}',
    'SELECT * FROM E:\Tlog\TerritoryData.csv'
);

這很重要

ODBC 驅動程式應該是 64 位元。 在 Windows 中開啟 [連接到 ODBC 數據源][SQL Server 匯入和匯出精靈] 應用程式的 [驅動程式] 索引卷標,以確認這一點。 有32位 Microsoft Text Driver (*.txt, *.csv) 無法與64位版本的 sqlservr.exe搭配使用。

F. 從儲存在 Azure Blob 儲存體 上的檔案存取數據

適用於: 僅限 SQL Server 2017 (14.x) 和更新版本。

在 SQL Server 2017 (14.x) 和更新版本中,下列範例會使用外部數據源,指向 Azure 記憶體帳戶中的容器,以及針對共用存取簽章建立的資料庫範圍認證。

SELECT * FROM OPENROWSET(
   BULK 'inv-2017-01-19.csv',
   DATA_SOURCE = 'MyAzureInvoices',
   SINGLE_CLOB
) AS DataFile;

如需包括設定認證和外部數據源的完整OPENROWSET範例,請參閱大量存取 Azure Blob 儲存體 中的數據範例。

G. 從儲存在 Azure Blob 儲存體 上的檔案匯入數據表

下列範例示範如何使用 OPENROWSET 命令,從您建立 SAS 金鑰的 Azure Blob 記憶體位置中的 csv 檔案載入數據。 Azure Blob 儲存體位置已設定為外部資料來源。 這需要使用在使用者資料庫中以主要金鑰加密的共用存取簽章來進行資料庫範圍認證。

-- Optional: a MASTER KEY is not required if a DATABASE SCOPED CREDENTIAL is not required because the blob is configured for public (anonymous) access!
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
GO

-- Optional: a DATABASE SCOPED CREDENTIAL is not required because the blob is configured for public (anonymous) access!
CREATE DATABASE SCOPED CREDENTIAL MyAzureBlobStorageCredential
    WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
    SECRET = '******srt=sco&sp=rwac&se=2017-02-01T00:55:34Z&st=2016-12-29T16:55:34Z***************';

-- Make sure that you don't have a leading ? in the SAS token, and that you
-- have at least read permission on the object that should be loaded srt=o&sp=r,
-- and that expiration period is valid (all dates are in UTC time)
CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
WITH (
    TYPE = BLOB_STORAGE,
    LOCATION = 'https://****************.blob.core.windows.net/curriculum',
    -- CREDENTIAL is not required if a blob is configured for public (anonymous) access!
    CREDENTIAL = MyAzureBlobStorageCredential
);

INSERT INTO achievements
WITH (TABLOCK) (
    id,
    description
)
SELECT * FROM OPENROWSET(
    BULK 'csv/achievements.csv',
    DATA_SOURCE = 'MyAzureBlobStorage',
    FORMAT = 'CSV',
    FORMATFILE = 'csv/achievements-c.xml',
    FORMATFILE_DATA_SOURCE = 'MyAzureBlobStorage'
) AS DataFile;

H. 針對外部來源使用受控識別

適用於: Azure SQL 受控實例和 Azure SQL Database

下列範例會使用受控識別建立認證、建立外部來源,然後從裝載於外部來源的 CSV 載入資料。

首先,建立認證,並將 Blob 儲存體指定為外部來源:

CREATE DATABASE SCOPED CREDENTIAL sampletestcred
WITH IDENTITY = 'MANAGED IDENTITY';

CREATE EXTERNAL DATA SOURCE SampleSource
WITH (
    LOCATION = 'abs://****************.blob.core.windows.net/curriculum',
    CREDENTIAL = sampletestcred
);

接下來,從裝載於 Blob 儲存體的 CSV 檔案載入資料:

SELECT * FROM OPENROWSET(
    BULK 'Test - Copy.csv',
    DATA_SOURCE = 'SampleSource',
    SINGLE_CLOB
) as test;

一. 使用 OPENROWSET 使用 S3 相容的物件記憶體來存取數個 Parquet 檔案

適用於:SQL Server 2022 (16.x) 和更新版本。

下列範例會使用從不同位置存取數個 Parquet 檔案,這些檔案全都儲存在 S3 相容的物件記憶體上:

CREATE DATABASE SCOPED CREDENTIAL s3_dsc
WITH IDENTITY = 'S3 Access Key',
SECRET = 'contosoadmin:contosopwd';
GO

CREATE EXTERNAL DATA SOURCE s3_eds
WITH
(
    LOCATION = 's3://10.199.40.235:9000/movies',
    CREDENTIAL = s3_dsc
);
GO

SELECT * FROM OPENROWSET(
    BULK (
        '/decades/1950s/*.parquet',
        '/decades/1960s/*.parquet',
        '/decades/1970s/*.parquet'
    ),
    FORMAT = 'PARQUET',
    DATA_SOURCE = 's3_eds'
) AS data;

J. 使用 OPENROWSET 從 Azure Data Lake Gen2 存取數個 Delta 數據表

適用於:SQL Server 2022 (16.x) 和更新版本。

在此範例中,數據表容器名為 Contoso,且位於 Azure Data Lake Gen2 儲存器帳戶上。

CREATE DATABASE SCOPED CREDENTIAL delta_storage_dsc
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = '<SAS Token>';

CREATE EXTERNAL DATA SOURCE Delta_ED
WITH (
    LOCATION = 'adls://<container>@<storage_account>.dfs.core.windows.net',
    CREDENTIAL = delta_storage_dsc
);

SELECT *
FROM OPENROWSET(
    BULK '/Contoso',
    FORMAT = 'DELTA',
    DATA_SOURCE = 'Delta_ED'
) AS result;

K. 使用 OPENROWSET 查詢公用匿名數據集

下列範例使用公開可用的 NYC 黃色計程車車程記錄開啟數據集

請先建立資料來源:

CREATE EXTERNAL DATA SOURCE NYCTaxiExternalDataSource
WITH (LOCATION = 'abs://nyctlc@azureopendatastorage.blob.core.windows.net');

在符合名稱模式的資料夾中查詢所有擴展名為 .parquet 的檔案:

SELECT TOP 10 *
FROM OPENROWSET(
 BULK 'yellow/puYear=*/puMonth=*/*.parquet',
 DATA_SOURCE = 'NYCTaxiExternalDataSource',
 FORMAT = 'parquet'
) AS filerows;

其他範例

如需使用 INSERT...SELECT * FROM OPENROWSET(BULK...)的更多範例,請參閱下列文章:

適用於:Microsoft Fabric 中的 SQL 分析端點和倉儲

T-SQL OPENROWSET 函式會讀取 Azure Data Lake Storage 中的檔案內容。 您可以讀取文字/CSV 或 Parquet 檔案格式。

OPENROWSET 函式會從檔案讀取數據,並將它當做數據列集傳回。 函 OPENROWSET 式可以在查詢的 子句中 FROM 參考,就像是數據表名稱一樣。

本文僅適用於Microsoft網狀架構倉儲。 網狀架構倉儲中的OPENROWSET函式與SQL分析端點項目之間有功能差異。

其他平台上類似範例的詳細數據和連結:

語法

SELECT <columns>
FROM OPENROWSET(
    BULK 'https://<storage>.blob.core.windows.net/path/folder1=*/folder2=*/filename.parquet'
    [, FORMAT = ('PARQUET' | 'CSV') ]

    -- Text formatting options
    [, DATAFILETYPE = {'char' | 'widechar' }     ]
    [, CODEPAGE = {'ACP' | 'OEM' | 'raw' | '<code_page>' } ]

    -- Text/CSV formatting options
    [, ROWTERMINATOR = 'row_terminator' ]
    [, FIELDTERMINATOR =  'field_terminator' ]
    [, FIELDQUOTE = 'string_delimiter' ]
    [, ESCAPECHAR = 'escape_char' ]
    [, HEADER_ROW = [true|false] ]
    [, FIRSTROW = first_row ]
    [, LASTROW = last_row ]

    -- execution options
    [, ROWS_PER_BATCH=number_of_rows]
) 
[
    WITH (  ( <column_name> <sql_datatype> [ '<column_path>' | <column_ordinal> ] )+ )
]
[ AS <alias> ]

論點

BULK 'data_file'

要讀取和傳回數據做為數據列集之數據檔的 URI。 URI 可以參考 Azure Data Lake 記憶體或 Azure Blob 記憶體。

URI 可以包含代表任何字元序列的 * 字元,並讓 OPENROWSET 與模式比對 URI。

BULK 輸入檔案格式選項

FORMAT = { 'CSV' |'PARQUET' }

指定參考檔案的格式。 如果路徑中的擴展名以 .csv、.parquet 或 .parq 結尾, FORMAT 則不需要指定 選項。 例如:

SELECT *
FROM OPENROWSET(
    BULK 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.parquet'
);

DATAFILETYPE = { 'char' |'widechar' }

指定 OPENROWSET(BULK) 應該讀取單一位元組(ASCII、UTF8) 或多位元組 (UTF16) 檔案內容。

DATAFILETYPE 值 所有資料的表示方式如下:
char (預設值) 字元格式。

如需詳細資訊,請參閱 使用字元格式匯入或匯出資料
widechar Unicode 字元。

如需詳細資訊,請參閱 使用 Unicode 字元格式匯入或匯出資料

CODEPAGE = { 'ACP' |'OEM' |'RAW' |'code_page' }

指定資料檔案中之資料的字碼頁。 CODEPAGE 只有在數據包含 字元值超過 127 或小於 32 的 charvarchartext 數據行時,才會相關。

CODEPAGE 值 說明
ACP charvarchartext 資料類型的資料行,從 ANSI/Microsoft Windows 字碼頁 (ISO 1252) 轉換成 SQL Server 字碼頁。
OEM (預設值) charvarchartext 資料類型的資料行,從系統 OEM 字碼頁轉換成 SQL Server 字碼頁。
RAW 不進行字碼頁之間的轉換。 這是最快的選項。
code_page 指出在哪一個來源字碼頁,將資料檔中的字元資料加以編碼;例如 850。

SQL Server 2016 (13.x) 之前的重要 版本不支援代碼頁 65001(UTF-8 編碼)。

文字/CSV 格式設定選項

ROWTERMINATOR = 'row_terminator'

指定要用於 charwidechar 資料檔案的資料列結束字元。 預設資料列結束字元是 \r\n (新行字元)。 如需詳細資訊,請參閱 指定字段和數據列終止符

FIELDTERMINATOR = 'field_terminator'

指定要用於 charwidechar 資料檔案的欄位結束字元。 預設欄位終止符為 , (逗號)。 如需詳細資訊,請參閱 指定字段和數據列終止符

FIELDQUOTE = 'field_quote'

指定做為 CSV 檔案中引號字元的字元。 如果未指定,則會使用引號字元 (") 作為 RFC 4180 標準中所定義的引號字元。

ESCAPE_CHAR = 'char'

指定檔案中用來將本身和所有分隔符號值逸出的字元。 如果逸出字元後面接著本身或任何分隔符號值以外的值,讀取值時就會捨棄逸出字元。

無論 FIELDQUOTE 已啟用或未啟用,都會套用 ESCAPECHAR 參數。 其不會用來逸出引號字元。 引號字元必須以另一個引號字元來逸出。 只有在以引號字元封住值時,引號字元才能在資料行值中出現。

HEADER_ROW = { TRUE |FALSE }

指定 CSV 檔案是否包含標頭資料列。 預設為 FALSE。 PARSER_VERSION=『2.0』中支援。 若為 TRUE,則會根據 FIRSTROW 引數,從第一個資料列讀取資料行名稱。 若為 TRUE,且結構描述是使用 WITH 指定的,則會以資料行名稱來執行資料行名稱的繫結,而不是序數位置。

FIRSTROW = first_row

指定要載入之第一個資料列的號碼。 預設值為 1。 這表示指定之資料檔中的第一個資料列。 資料列號碼是由計算資料列結束字元所決定。 FIRSTROW 是以1為基礎。

LASTROW = last_row

指定要載入之最後一個資料列的號碼。 預設值為 0。 這表示指定的資料檔中的最後一個資料列。

執行選項

ROWS_PER_BATCH = rows_per_batch

指定資料檔案中資料列的近似數目。 這個值應該與實際的資料列數差不多。

根據預設,根據檔案特性估計 ROWS_PER_BATCH(檔案數目、檔案大小、傳回數據類型的大小)。 指定 ROWS_PER_BATCH = 0 與省略 ROWS_PER_BATCH相同。

WITH 架構

WITH 架構會指定定義 OPENROWSET 函式結果集的數據行。 其中包含將傳回結果之每個數據行的數據行定義,並概述將基礎檔案數據行系結至結果集中數據行的對應規則。

<column_name>

將在結果數據列集中傳回的數據行名稱。 除非由 <column_path><column_ordinal>覆寫,否則此數據行的數據會從具有相同名稱的基礎檔案數據行讀取。

<column_type>

結果集中數據行的 T-SQL 類型。 當 OPENROWSET 傳回結果時,基礎檔案中的值會轉換成此類型。

<column_path>

點分隔路徑(例如 $.description.location.lat),用來參考 Parquet 等複雜類型的巢狀欄位。

<column_ordinal>

數位,表示將對應至 WITH 子句中數據行之數據行的實體索引。

備註

下表摘要說明支援的功能:

特徵 / 功能 支持 無法提供
檔案格式 Parquet、CSV Delta、Azure Cosmos DB
驗證 EntraID 傳遞、公用記憶體 SAS/SAK、SPN、受控存取
儲存空間 Azure Blob 存儲、Azure Data Lake 存儲 OneLake
選項 中只有完整/絕對 URI OPENROWSET 中的 OPENROWSET相對 URI 路徑, DATA_SOURCE
數據分割 您可以在查詢中使用 filepath() 函式。

範例

A。 從 Azure Blob 記憶體讀取 parquet 檔案

在下列範例中,您可以看到如何從 Parquet 檔案讀取 100 個數據列:

SELECT TOP 100 * 
FROM OPENROWSET(
    BULK 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.parquet'
);

B. 讀取自定義 CSV 檔案

在下列範例中,您可以看到如何使用標頭數據列和明確指定的終止符來讀取 CSV 檔案中的數據列,以分隔數據列和欄位:

SELECT *
FROM OPENROWSET(
BULK 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv',
 HEADER_ROW = TRUE,
 ROW_TERMINATOR = '\n',
 FIELD_TERMINATOR = ',');

C. 讀取檔案時指定檔案數據行架構

在下列範例中,您可以看到如何明確指定 OPENROWSET 函式所傳回之數據列的架構:

SELECT *
FROM OPENROWSET(
BULK 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.parquet') 
WITH (
        updated DATE
        ,confirmed INT
        ,deaths INT
        ,iso2 VARCHAR(8000)
        ,iso3 VARCHAR(8000)
        );

D. 讀取數據分割數據集

在下列範例中,您可以看到如何使用 filepath() 函式,從相符的檔案路徑讀取 URI 的部分:

SELECT TOP 10 
  files.filepath(2) AS area
, files.*
FROM OPENROWSET(
BULK 'https://synapseaisolutionsa.blob.core.windows.net/public/NYC_Property_Sales_Dataset/*_*.csv',
 HEADER_ROW = TRUE) 
AS files
WHERE files.filepath(1) = '2009';