OPENROWSET BULK (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例

OPENROWSET T-SQL 命令包括从外部数据源访问远程数据所需的所有连接信息。 OPENROWSET 还通过内置的 BULK 提供程序支持大容量操作,正是有了该提供程序,才能从文件读取数据并将数据作为行集返回。 OPENROWSET BULK 用于从外部数据文件进行读取, OPENROWSET 不大容量用于从另一个数据库引擎进行读取。

OPENROWSET可以在查询的子句中FROM引用该函数,就好像它是表名一样。 OPENROWSET还可以将函数引用为受数据提供程序功能约束的 INSERTUPDATEDELETE语句的目标。 尽管查询可能返回多个结果集,但 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 可能发生。 在到达之前 MAXERRORSOPENROWSET 请忽略每个错误的行,不加载该行,并将错误行计数为一个错误。

默认 maximum_errors 为 10 。

注释

MAX_ERRORS 不适用于 CHECK 约束或转换 货币bigint 数据类型。

BULK 数据处理选项

数据源

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)大型对象(LOB)类型(textntextimage) 列。

SINGLE_BLOB

将 data_file 内容返回为类型 varbinary(max) 单行、单列的行集 。

重要

建议仅使用 SINGLE_BLOB 选项(而不是 SINGLE_CLOBSINGLE_NCLOB)导入 XML 数据,因为仅 SINGLE_BLOB 支持所有 Windows 编码转换。

SINGLE_CLOB

通过以 ASCII 格式读取 data_file,使用当前数据库的排序规则将内容作为类型为 varchar(max) 的单行单列行集返回 。

SINGLE_NCLOB

通过将data_file读取为 Unicode,使用当前数据库的排序规则以 nvarchar(max) 类型的单行单列行集的形式返回内容。

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

BULK 输入文件格式选项

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

指定该数据文件中数据的代码页。 CODEPAGE仅当数据包含字符值超过 127 或小于 32 的字符、varchar文本列时,才相关。

重要

CODEPAGE Linux 上不支持的选项。

注释

我们建议为格式文件中的每个列指定一个排序规则名称,除非你希望 65001 选项优先于排序规则/代码页规范。

CODEPAGE 值 DESCRIPTION
ACP 将数据类型为 char、varchar 或 text 的列由 ANSI/Microsoft Windows 代码页 (ISO 1252) 转换为 SQL Server 代码页 。
OEM(默认值) 将数据类型为 char、varchar 或 text 的列由系统 OEM 代码页 (ISO 1252) 转换为 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仅当为指定的提供程序显式设置为 0 注册表选项并且启用了即席分布式查询高级配置选项时,才可用于从 OLE DB 数据源访问远程数据。 如果未设置这些选项,则默认行为不允许临时访问。

访问远程 OLE DB 数据源时,不会从客户端连接到正在查询的服务器自动委派受信任连接的登录标识。 必须配置身份验证委托。

如果数据提供程序支持指定数据源中的多个目录和架构,则需要目录和架构名称。 catalog schema当数据提供程序不支持这些值时,可以省略这些值。 如果提供程序仅支持架构名称,则必须指定窗体 schema.object 的两部分名称。 如果提供程序仅支持目录名称,则必须指定表单 catalog.schema.object 的三部分名称。 有关详细信息,请参阅 Transact-SQL 语法约定

必须为使用 SQL Server Native Client OLE DB 提供程序的传递查询指定由三部分组成的名称。

OPENROWSET 不接受其参数的变量。

OPENDATASOURCE 子句中对 OPENQUERYOPENROWSETFROM 的任何调用与对用作更新目标的这些函数的任何调用都是分开独立计算的,即使为两个调用提供的参数相同也是如此。 具体而言,应用到上述任一调用的结果的筛选器或联接条件不会影响其他调用的结果。

将 OPENROWSET 与 BULK 选项配合使用

以下 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...)假定如果未指定,则最大长度SQLCHARSQLNCHARSQLBINARY或数据长度不超过 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 语法。

答: 使用 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。

以下示例使用格式化文件检索用制表符分隔的文本文件 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 数据库

以下示例使用托管标识创建凭据,创建外部源,然后从托管在外部源上的 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 存储中文件的内容。 可以读取文本/CSV 或 Parquet 文件格式。

OPENROWSET 函数从文件读取数据,并将其作为行集返回。 OPENROWSET可以在查询的子句中FROM引用该函数,就好像它是表名一样。

本文仅适用于Microsoft Fabric Warehouse。 Fabric Warehouse 中的 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 的字符、varchar文本列时,才相关。

CODEPAGE 值 DESCRIPTION
ACP 将数据类型为 char、varchar 或 text 的列由 ANSI/Microsoft Windows 代码页 (ISO 1252) 转换为 SQL Server 代码页 。
OEM(默认值) 将数据类型为 char、varchar 或 text 的列由系统 OEM 代码页 (ISO 1252) 转换为 SQL Server 代码页 。
RAW 不执行从一个代码页到另一个代码页的转换。 这是执行最快的选项。
code_page 指示数据文件中字符数据已编码的源代码页,例如 850。

SQL Server 2016(13.x)之前的重要 版本不支持代码页 65001(UTF-8 编码)。

文本/CSV 格式设置选项

ROWTERMINATOR = “row_terminator

指定要用于 字符widechar 数据文件的行终止符。 默认行终止符为 \r\n(换行符)。 有关详细信息,请参阅 “指定字段和行终止符”。

FIELDTERMINATOR = “field_terminator

指定要用于 字符widechar 数据文件的字段终止符。 默认字段终止符为 , (逗号)。 有关详细信息,请参阅 “指定字段和行终止符”。

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>

用于引用复杂类型(例如 Parquet)中的嵌套字段的点分隔路径(例如 $.description.___location.lat)。

<column_ordinal>

一个数字,表示将映射到 WITH 子句中列的列的物理索引。

注解

表中汇总了支持的功能:

功能 / 特点 已支持 不可用
文件格式 Parquet、CSV Delta、Azure Cosmos DB
身份验证 EntraID 直通、公共存储 SAS/SAK、SPN、托管访问
存储 Azure Blob 存储、Azure Data Lake Storage OneLake
选项 仅包含完整/绝对 URI OPENROWSET 中的 OPENROWSET相对 URI 路径, DATA_SOURCE
分区 可以在查询中使用 filepath() 函数。

例子

答: 从 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';