如何在 Azure Synapse Analytics 中使用無伺服器 SQL 集區來使用 OPENROWSET

OPENROWSET(BULK...) 式可讓您存取Azure 儲存體中的檔案。 OPENROWSET 函式會讀取遠端資料源的內容(例如檔案),並以一組資料列的形式傳回內容。 在無伺服器 SQL 集區資源內,呼叫 OPENROWSET 函式並指定 BULK 選項,即可存取 OPENROWSET 大量資料列集提供者。

OPENROWSET 式可以在查詢的 子句中 FROM 參考,就像是資料表名稱 OPENROWSET 一樣。 它透過內建 BULK 提供者支援大量作業,讓檔案中的資料可以讀取和傳回為數據列集。

注意

專用 SQL 集區不支援 OPENROWSET 函式。

資料來源

Synapse SQL 中的 OPENROWSET 函式會從資料來源讀取檔案的內容。 資料來源是 Azure 儲存體帳戶,它可以在 函式中 OPENROWSET 明確參考,也可以從您要讀取之檔案的 URL 動態推斷。 函 OPENROWSET 式可以選擇性地包含 DATA_SOURCE 參數,以指定包含檔案的資料來源。

  • OPENROWSET 不使用 DATA_SOURCE 即可從指定為 BULK 選項的 URL 位置直接讀取檔案的內容:

    SELECT *
    FROM OPENROWSET(BULK 'http://<storage account>.dfs.core.windows.net/container/folder/*.parquet',
                    FORMAT = 'PARQUET') AS [file]
    

這是一種快速且簡單的方式,不需要預先設定即可讀取檔案的內容。 此選項可讓您使用基本身份驗證選項來存取儲存體(Microsoft Entra 登入的 Microsoft Entra 傳遞和 SQL 登入的 SAS 權杖)。

  • OPENROWSET 使用 DATA_SOURCE 可用來存取指定儲存體帳戶上的檔案:

    SELECT *
    FROM OPENROWSET(BULK '/folder/*.parquet',
                    DATA_SOURCE='storage', --> Root URL is in LOCATION of DATA SOURCE
                    FORMAT = 'PARQUET') AS [file]
    

    此選項可讓您設定資料來源中儲存體帳戶的位置,並指定應該用來存取儲存體的驗證方法。

    重要

    OPENROWSET 沒有 DATA_SOURCE 提供快速且簡單的方法來存取儲存體檔案,但提供有限的驗證選項。 例如,Microsoft Entra 主體只能使用其 Microsoft Entra 身分 識別或公開可用的檔案來存取檔案。 如果您需要更強大的驗證選項,請使用 DATA_SOURCE 選項並定義您想要用來存取儲存體的認證。

安全性

資料庫使用者必須具有 ADMINISTER BULK OPERATIONS 使用函 OPENROWSET 式的許可權。

儲存體系統管理員也必須提供有效的 SAS 權杖或啟用 Microsoft Entra 主體來存取儲存體檔案,讓使用者能夠存取檔案。 在本文中深入瞭解儲存體存取控制

OPENROWSET 使用下列規則來判斷如何向儲存體進行驗證:

  • 在沒有驗證機制的情況下 OPENROWSETDATA_SOURCE ,取決於呼叫端類型。
    • 任何使用者都可以使用 OPENROWSET ,而不需要 DATA_SOURCE 讀取 Azure 儲存體上的公開可用檔案。
    • 如果 Azure 儲存體允許 Microsoft Entra 使用者存取基礎檔案,則 Microsoft Entra 登入可以使用自己的 Microsoft Entra 身 分識別來存取受保護的檔案(例如,如果呼叫者具有 Storage Reader Azure 儲存體的許可權)。
    • SQL 登入也可以使用 OPENROWSET ,而不需要 DATA_SOURCE 存取公開可用的檔案、使用 SAS 權杖保護的檔案,或 Synapse 工作區的受控識別。 您必須建立伺服器範圍認證 ,以允許存取儲存體檔案。
  • OPENROWSET 中,驗證 DATA_SOURCE 機制是在指派給參考資料源的資料庫範圍認證中定義。 此選項可讓您使用 SAS 權杖、工作區的受控識別或呼叫端的 Microsoft Entra 身分識別來存取公開可用的儲存體,或 存取儲存體(如果呼叫者 為 Microsoft Entra 主體)。 如果 DATA_SOURCE 參考非公用的 Azure 儲存體,您必須 建立資料庫範圍的認證 ,並在 中 DATA SOURCE 參考它,以允許存取儲存體檔案。

呼叫端必須具有 REFERENCES 認證的許可權,才能使用它向儲存體進行驗證。

語法

--OPENROWSET syntax for reading Parquet or Delta Lake files
OPENROWSET  
( { BULK 'unstructured_data_path' , [DATA_SOURCE = <data source name>, ]
    FORMAT= ['PARQUET' | 'DELTA'] }  
)  
[WITH ( {'column_name' 'column_type' }) ]
[AS] table_alias(column_alias,...n)

--OPENROWSET syntax for reading delimited text files
OPENROWSET  
( { BULK 'unstructured_data_path' , [DATA_SOURCE = <data source name>, ] 
    FORMAT = 'CSV'
    [ <bulk_options> ]
    [ , <reject_options> ] }  
)  
WITH ( {'column_name' 'column_type' [ 'column_ordinal' | 'json_path'] })  
[AS] table_alias(column_alias,...n)
 
<bulk_options> ::=  
[ , FIELDTERMINATOR = 'char' ]    
[ , ROWTERMINATOR = 'char' ] 
[ , ESCAPECHAR = 'char' ] 
[ , FIRSTROW = 'first_row' ]     
[ , FIELDQUOTE = 'quote_characters' ]
[ , DATA_COMPRESSION = 'data_compression_method' ]
[ , PARSER_VERSION = 'parser_version' ]
[ , HEADER_ROW = { TRUE | FALSE } ]
[ , DATAFILETYPE = { 'char' | 'widechar' } ]
[ , CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' } ]
[ , ROWSET_OPTIONS = '{"READ_OPTIONS":["ALLOW_INCONSISTENT_READS"]}' ]

<reject_options> ::=  
{  
    | MAXERRORS = reject_value,  
    | ERRORFILE_DATA_SOURCE = <data source name>,
    | ERRORFILE_LOCATION = '/REJECT_Directory'
}  

引數

您有三個輸入檔的選項,其中包含用於查詢的目標資料。 有效值為:

  • 'CSV' - 包含具有資料列/資料行分隔符號的任何分隔文字檔。 任何字元都可以做為欄位分隔符號,例如 TSV:FIELDTERMINATOR = 索引標籤。

  • 'PARQUET' - Parquet 格式的二進位檔案

  • 'DELTA' - 一組以 Delta Lake 組織的 Parquet 檔案 (預覽) 格式

空格值無效,例如 'CSV' 不是有效的值。

'unstructured_data_path'

建立資料路徑的unstructured_data_path可能是絕對路徑或相對路徑:

  • 格式 \<prefix>://\<storage_account_path>/\<storage_path> 的絕對路徑可讓使用者直接讀取檔案。
  • 格式的相對路徑,該格式 <storage_path> 必須與 參數搭配 DATA_SOURCE 使用,並描述 中所定義之storage_account_path > 位置內的 <EXTERNAL DATA SOURCE 檔案模式。

您會在下方找到連結至特定外部資料源的相關 < 儲存體帳戶路徑 > 值。

外部資料來源 Prefix 儲存體帳戶路徑
Azure Blob 儲存體 HTTP[s] <>storage_account.blob.core.windows.net/path/file
Azure Blob 儲存體 wasb[s] <container > @ < storage_account.blob.core.windows.net/path/file >
Azure Data Lake Store Gen1 HTTP[s] <>storage_account.azuredatalakestore.net/webhdfs/v1
Azure Data Lake Store Gen2 HTTP[s] <>storage_account.dfs.core.windows.net /path/file
Azure Data Lake Store Gen2 abfs[s] <>file_system@ < account_name.dfs.core.windows.net/path/file >

' < storage_path > '

指定儲存體內指向您要讀取之資料夾或檔案的路徑。 如果路徑指向容器或資料夾,則會從該特定容器或資料夾讀取所有檔案。 子資料夾中的檔案將不會包含。

您可以使用萬用字元以多個檔案或資料夾為目標。 允許使用多個非連續萬用字元。 以下範例會從以 /csv/population 開頭的所有資料夾讀取所有從母體擴展 開始 的所有 csv 檔案:
https://sqlondemandstorage.blob.core.windows.net/csv/population*/population*.csv

如果您將unstructured_data_path指定為資料夾,則無伺服器 SQL 集區查詢會從該資料夾擷取檔案。

您可以指示無伺服器 SQL 集區在路徑結尾指定 /* 來周遊資料夾,例如: https://sqlondemandstorage.blob.core.windows.net/csv/population/**

注意

不同于 Hadoop 和 PolyBase,除非您在路徑結尾指定 /**,否則無伺服器 SQL 集區不會傳回子資料夾。 就像 Hadoop 和 PolyBase 一樣,它不會傳回檔案名開頭為底線 (_) 或句號 (.) 的檔案。

在下列範例中,如果 unstructured_data_path= https://mystorageaccount.dfs.core.windows.net/webdata/ ,無伺服器 SQL 集區查詢會從 mydata.txt 傳回資料列。 而不會傳回 mydata2 .txt 和 mydata3.txt,因為位於子資料夾中。

Recursive data for external tables

[WITH ( {'column_name' 'column_type' [ 'column_ordinal'] }) ]

WITH 子句可讓您指定您想要從檔案讀取的資料行。

  • 若要讓 CSV 資料檔案讀取所有資料行,請提供資料行名稱和其資料類型。 如果您想要資料行的子集,請使用序數從原始資料檔案中挑選資料行的序數。 資料行將會由序數指定系結。 如果使用 HEADER_ROW = TRUE,則資料行系結會以資料行名稱完成,而不是序數位置。

    提示

    您也可以省略 CSV 檔案的 WITH 子句。 資料類型會自動從檔案內容推斷。 您可以使用 HEADER_ROW 引數來指定標頭資料列是否存在,在此情況下,資料行名稱會從標頭資料列讀取。 如需詳細資訊,請參閱 自動架構探索

  • 針對 Parquet 或 Delta Lake 檔案,提供符合原始資料檔案中資料行名稱的資料行名稱。 資料行會依名稱系結,且區分大小寫。 如果省略 WITH 子句,則會傳回 Parquet 檔案中的所有資料行。

    重要

    Parquet 和 Delta Lake 檔案中的資料行名稱會區分大小寫。 如果您在檔案中指定大小寫的資料行名稱與資料行名稱大小寫不同, NULL 則會傳回該資料行的值。

column_name = 輸出資料行的名稱。 如果提供,則此名稱會覆寫來源檔案中的資料行名稱,如果有的話,則會覆寫 JSON 路徑中提供的資料行名稱。 如果未提供json_path,它會自動新增為 '$.column_name'。 檢查json_path引數是否有行為。

column_type = 輸出資料行的資料類型。 隱含資料類型轉換將會在這裡進行。

column_ordinal = 原始程式檔中資料行的序數。 因為系結是依名稱完成,因此會忽略 Parquet 檔案的這個引數。 下列範例只會從 CSV 檔案傳回第二個數據行:

WITH (
    --[country_code] VARCHAR (5) COLLATE Latin1_General_BIN2,
    [country_name] VARCHAR (100) COLLATE Latin1_General_BIN2 2
    --[year] smallint,
    --[population] bigint
)

json_path = 資料行或巢狀屬性的 JSON 路徑運算式 。 預設 路徑模式 為 lax。

注意

如果提供的路徑不存在,在 strict 模式查詢中將會失敗,並出現錯誤。 在 lax 模式查詢中將會成功,JSON 路徑運算式會評估為 Null。

<bulk_options>

FIELDTERMINATOR ='field_terminator'

指定要使用的欄位結束字元。 預設欄位結束字元為逗號 (「, 」 )。

ROWTERMINATOR ='row_terminator''

指定要使用的資料列結束字元。 如果未指定資料列結束字元,則會使用其中一個預設結束字元。 PARSER_VERSION = '1.0' 的預設結束字元為 \r\n、\n 和 \r。 PARSER_VERSION = '2.0' 的預設結束字元為 \r\n 和 \n。

注意

當您使用 PARSER_VERSION='1.0' 並將 \n (newline) 指定為數據列結束字元時,它會自動加上 \r(歸位字元)字元,這會導致資料列結束字元為 \r\n。

ESCAPE_CHAR = 'char'

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

不論 FIELDQUOTE 為或未啟用,都會套用 ESCAPECHAR 參數。 它不會用來逸出引用字元。 引號字元必須以另一個引號字元逸出。 只有當值是以引號字元封裝時,引號字元才會出現在資料行值內。

FIRSTROW = 'first_row'

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

FIELDQUOTE = 'field_quote'

指定將用來當作 CSV 檔案中引號字元的字元。 如果未指定,則會使用引號字元 (「) 。

DATA_COMPRESSION = 'data_compression_method'

指定壓縮方法。 僅PARSER_VERSION='1.0' 支援。 支援下列壓縮方法:

  • Gzip

PARSER_VERSION = 'parser_version'

指定讀取檔案時要使用的剖析器版本。 目前支援的 CSV 剖析器版本為 1.0 和 2.0:

  • PARSER_VERSION = '1.0'
  • PARSER_VERSION = '2.0'

CSV 剖析器 1.0 版是預設值,功能豐富。 2.0 版是針對效能而建置,且不支援所有選項和編碼。

CSV 剖析器 1.0 版特寫:

  • 不支援下列選項:HEADER_ROW。
  • 預設結束字元為 \r\n、\n 和 \r。
  • 如果您將 \n (newline) 指定為數據列結束字元,它會自動加上 \r(歸位字元)字元,這會導致 \r\n 的資料列結束字元。

CSV 剖析器 2.0 版特寫:

  • 並非所有資料類型都受到支援。
  • 字元資料行長度上限為 8000。
  • 資料列大小上限為 8 MB。
  • 不支援下列選項:DATA_COMPRESSION。
  • 引號空字串 (「」) 會解譯為空字串。
  • 未接受 DATEFORMAT SET 選項。
  • DATE 資料類型支援的格式:YYYY-MM-DD
  • TIME 資料類型支援的格式:HH:MM:SS[.fractional seconds]
  • DATETIME2資料類型支援的格式:YYYY-MM-DD HH:MM:SS[.fractional seconds]
  • 預設結束字元為 \r\n 和 \n。

HEADER_ROW = { TRUE |FALSE }

指定 CSV 檔案是否包含標頭資料列。 預設值為 FALSE. PARSER_VERSION='2.0'。 如果為 TRUE,則會根據 FIRSTROW 引數從第一個資料列讀取資料行名稱。 如果使用 WITH 指定 TRUE 和架構,資料行名稱的系結將會由資料行名稱完成,而不是序數位置。

DATAFILETYPE = { 'char' |'widechar' }

指定編碼: char 用於 UTF8, widechar 用於 UTF16 檔案。

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

指定資料檔案中之資料的字碼頁。 預設值為 65001(UTF-8 編碼)。 如需此選項 的詳細資訊,請參閱這裡

ROWSET_OPTIONS = '{"READ_OPTIONS":["ALLOW_INCONSISTENT_READS"]}'

此選項會在查詢執行期間停用檔案修改檢查,並讀取查詢執行時更新的檔案。 當您需要讀取查詢執行時附加的僅限附加檔案時,這個選項很有用。 在可附加的檔案中,不會更新現有的內容,而且只會新增新的資料列。 因此,相較于可更新的檔案,錯誤結果的機率會降到最低。 此選項可讓您讀取經常附加的檔案,而不會處理錯誤。 請參閱查詢可附加 CSV 檔案 一節的詳細資訊

拒絕選項

注意

拒絕的資料列功能處於公開預覽狀態。 請注意,拒絕的資料列功能適用于分隔文字檔和PARSER_VERSION 1.0。

您可以指定拒絕參數,以判斷服務如何處理 從外部資料源擷取的髒 記錄。 如果實際資料類型不符合外部資料表的資料行定義,則資料記錄會被視為「已變更」。

當您未指定或變更拒絕選項時,服務會使用預設值。 服務會使用拒絕選項來判斷實際查詢失敗之前可以拒絕的資料列數目。 查詢將會傳回 (部分) 結果,直到超過拒絕閾值為止。 接著它便會失敗並顯示適當的錯誤訊息。

MAXERRORS = reject_value

指定查詢失敗之前可以拒絕的資料列數目。 MAXERRORS 必須是介於 0 到 2,147,483,647 之間的整數。

ERRORFILE_DATA_SOURCE = 資料來源

指定應該寫入拒絕的資料列和對應的錯誤檔案的資料來源。

ERRORFILE_LOCATION = 目錄位置

指定DATA_SOURCE內的目錄,或指定時ERROR_FILE_DATASOURCE拒絕的資料列和對應的錯誤檔案應該寫入。 如果指定的路徑不存在,服務會代表您建立一個路徑。 會建立名稱為 "rejectedrows" 的子目錄。" " 字元可確保該目錄從其他資料處理逸出,除非已明確在位置參數中指名。 在此目錄中,會根據載入提交格式YearMonthDay_HourMinuteSecond_StatementID建立資料夾(例如 20180330-173205-559EE7D2-196D-400A-806D-3BF5D007F891)。 您可使用陳述式識別碼,讓資料夾與產生識別碼的查詢相互關聯。 在此資料夾中,會寫入兩個檔案:error.json 檔案和資料檔案。

error.json 檔案包含 json 陣列,其中發生與拒絕的資料列相關的錯誤。 代表錯誤的元素都包含下列屬性:

屬性 描述
錯誤 資料列被拒絕的原因。
資料列 檔案中的拒絕資料列序數。
資料行 拒絕資料行序數。
拒絕資料行值。 如果值大於 100 個字元,則僅顯示前 100 個字元。
檔案 資料列所屬的檔案路徑。

快速分隔文字剖析

您可以使用兩個分隔的文字剖析器版本。 CSV 剖析器 1.0 版是預設值,而且功能豐富,而剖析器 2.0 版則是為了效能而建置。 剖析器 2.0 的效能改進來自進階剖析技術和多執行緒處理。 隨著檔案大小的增長,速度的差異將會更大。

自動架構探索

您可以省略 WITH 子句,輕鬆地查詢 CSV 和 Parquet 檔案,而不需知道或指定架構。 資料行名稱和資料類型將從檔案推斷。

Parquet 檔案包含將會讀取的資料行中繼資料,您可以在 Parquet 的類型對應中找到 類型對應。 檢查 讀取 Parquet 檔案,而不指定範例的架構

針對 CSV 檔案,可以從標頭資料列讀取資料行名稱。 您可以使用 HEADER_ROW 引數來指定標頭資料列是否存在。 如果HEADER_ROW = FALSE,則會使用泛型資料行名稱:C1、C2、 ...Cn,其中 n 是檔案中的資料行數目。 資料類型將從前 100 個數據列推斷。 檢查 讀取 CSV 檔案,而不指定範例的架構

請記住,如果您要一次讀取檔案數目,則會從第一個檔案服務推斷架構從儲存體取得。 這可能表示會省略某些預期的資料行,全部是因為服務用來定義架構的檔案不包含這些資料行。 在此情況下,請使用 OPENROWSET WITH 子句。

重要

因為缺少資訊而無法推斷適當的資料類型,因此會改用較大的資料類型。 這會帶來效能額外負荷,對於將推斷為 Varchar(8000) 的字元資料行來說,這特別重要。 為了獲得最佳效能,請檢查 推斷的資料類型 ,並使用 適當的資料類型

Parquet 的類型對應

Parquet 和 Delta Lake 檔案包含每個資料行的類型描述。 下表描述 Parquet 類型如何對應至 SQL 原生類型。

Parquet 類型 Parquet 邏輯類型 (注釋) SQL 資料類型
BOOLEAN bit
BINARY / BYTE_ARRAY varbinary
DOUBLE float
FLOAT real
INT32 int
INT64 bigint
INT96 datetime2
FIXED_LEN_BYTE_ARRAY binary
BINARY [UTF8] varchar (UTF8 collation)
BINARY 字串 varchar (UTF8 collation)
BINARY 枚舉 varchar (UTF8 collation)
FIXED_LEN_BYTE_ARRAY Uuid UNIQUEIDENTIFIER
BINARY DECIMAL decimal
BINARY JSON Varchar(8000) *(UTF8 定序)
BINARY BSON 不支援
FIXED_LEN_BYTE_ARRAY DECIMAL decimal
BYTE_ARRAY INTERVAL 不支援
INT32 INT(8, true) smallint
INT32 INT(16, true) smallint
INT32 INT(32, true) int
INT32 INT(8, false) tinyint
INT32 INT(16, false) int
INT32 INT(32, false) bigint
INT32 日期 date
INT32 DECIMAL decimal
INT32 時間(米利斯) time
INT64 INT(64, true) BIGINT
INT64 INT(64, false) 十進位(20,0)
INT64 DECIMAL decimal
INT64 時間(MICROS) time
INT64 時間(NANOS) 不支援
INT64 時間戳記 (標準化為 utc ) ( MILLIS / MICROS) datetime2
INT64 時間戳記( 未標準化為 utc ) (MILLIS / MICROS) Bigint - 請務必先使用時區位移來明確調整 bigint 值,再將它轉換成 datetime 值。
INT64 時間戳記 (NANOS) 不支援
複雜類型 清單 Varchar(8000),序列化為 JSON
複雜類型 MAP Varchar(8000),序列化為 JSON

範例

讀取 CSV 檔案而不指定架構

下列範例會讀取包含標頭資料列的 CSV 檔案,而不指定資料行名稱和資料類型:

SELECT 
    *
FROM OPENROWSET(
    BULK 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/ecdc_cases/latest/ecdc_cases.csv',
    FORMAT = 'CSV',
    PARSER_VERSION = '2.0',
    HEADER_ROW = TRUE) as [r]

下列範例會讀取不包含標頭資料列的 CSV 檔案,而不指定資料行名稱和資料類型:

SELECT 
    *
FROM OPENROWSET(
    BULK 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/ecdc_cases/latest/ecdc_cases.csv',
    FORMAT = 'CSV',
    PARSER_VERSION = '2.0') as [r]

讀取 Parquet 檔案而不指定架構

下列範例會以 Parquet 格式傳回普查資料集中第一個資料列的所有資料行,而不指定資料行名稱和資料類型:

SELECT 
    TOP 1 *
FROM  
    OPENROWSET(
        BULK 'https://azureopendatastorage.blob.core.windows.net/censusdatacontainer/release/us_population_county/year=20*/*.parquet',
        FORMAT='PARQUET'
    ) AS [r]

讀取 Delta Lake 檔案而不指定架構

下列範例會以 Delta Lake 格式從人口普查資料集傳回第一個資料列的所有資料行,而不指定資料行名稱和資料類型:

SELECT 
    TOP 1 *
FROM  
    OPENROWSET(
        BULK 'https://azureopendatastorage.blob.core.windows.net/censusdatacontainer/release/us_population_county/year=20*/*.parquet',
        FORMAT='DELTA'
    ) AS [r]

從 CSV 檔案讀取特定資料行

下列範例只會傳回母體*.csv 檔案中序數位 1 和 4 的兩個數據行。 由於檔案中沒有標頭資料列,因此會從第一行開始讀取:

SELECT 
    * 
FROM OPENROWSET(
        BULK 'https://sqlondemandstorage.blob.core.windows.net/csv/population/population*.csv',
        FORMAT = 'CSV',
        FIRSTROW = 1
    )
WITH (
    [country_code] VARCHAR (5) COLLATE Latin1_General_BIN2 1,
    [population] bigint 4
) AS [r]

從 Parquet 檔案讀取特定資料行

下列範例只會從人口普查資料集傳回第一個資料列的兩個數據行,格式為 Parquet:

SELECT 
    TOP 1 *
FROM  
    OPENROWSET(
        BULK 'https://azureopendatastorage.blob.core.windows.net/censusdatacontainer/release/us_population_county/year=20*/*.parquet',
        FORMAT='PARQUET'
    )
WITH (
    [stateName] VARCHAR (50),
    [population] bigint
) AS [r]

使用 JSON 路徑指定資料行

下列範例示範如何在 WITH 子句中使用 JSON 路徑運算式 ,並示範 strict 和 lax 路徑模式之間的差異:

SELECT 
    TOP 1 *
FROM  
    OPENROWSET(
        BULK 'https://azureopendatastorage.blob.core.windows.net/censusdatacontainer/release/us_population_county/year=20*/*.parquet',
        FORMAT='PARQUET'
    )
WITH (
    --lax path mode samples
    [stateName] VARCHAR (50), -- this one works as column name casing is valid - it targets the same column as the next one
    [stateName_explicit_path] VARCHAR (50) '$.stateName', -- this one works as column name casing is valid
    [COUNTYNAME] VARCHAR (50), -- STATEname column will contain NULLs only because of wrong casing - it targets the same column as the next one
    [countyName_explicit_path] VARCHAR (50) '$.COUNTYNAME', -- STATEname column will contain NULLS only because of wrong casing and default path mode being lax

    --strict path mode samples
    [population] bigint 'strict $.population' -- this one works as column name casing is valid
    --,[population2] bigint 'strict $.POPULATION' -- this one fails because of wrong casing and strict path mode
)
AS [r]

在 BULK 路徑中指定多個檔案/資料夾

下列範例示範如何在 BULK 參數中使用多個檔案/資料夾路徑:

SELECT 
    TOP 10 *
FROM  
    OPENROWSET(
        BULK (
            'https://azureopendatastorage.blob.core.windows.net/censusdatacontainer/release/us_population_county/year=2000/*.parquet',
            'https://azureopendatastorage.blob.core.windows.net/censusdatacontainer/release/us_population_county/year=2010/*.parquet'
        ),
        FORMAT='PARQUET'
    )
AS [r]

下一步

如需更多範例,請參閱 查詢資料儲存體快速入門 ,以瞭解如何用來 OPENROWSET 讀取 CSV PARQUET DELTA LAKE JSON 檔案格式。 檢查 最佳做法 以達到最佳效能。 您也可以瞭解如何使用 CETAS 將查詢的結果儲存至Azure 儲存體。