OPENROWSET (Transact-SQL)

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

包含访问 OLE DB 数据源中的远程数据所需的所有连接信息。 当访问链接服务器中的表时,这种方法是一种替代方法,并且是一种使用 OLE DB 连接并访问远程数据的一次性的临时方法。 对于较频繁引用 OLE DB 数据源的情况,请改为使用链接服务器。 有关详细信息,请参阅链接服务器(数据库引擎)OPENROWSET可以在查询的子句中FROM引用该函数,就好像它是表名一样。 依据 OLE DB 提供程序的功能,还可以将 OPENROWSET 函数引用为 INSERTUPDATEDELETE 语句的目标表。 尽管查询可能返回多个结果集,但 OPENROWSET 只返回第一个结果集。

OPENROWSET 还通过内置的 BULK 提供程序支持大容量操作,正是有了该提供程序,才能从文件读取数据并将数据作为行集返回。

本文中的许多示例仅适用于 SQL Server。 其他平台上类似示例的详细信息和链接:

  • Azure SQL 数据库仅支持从 Azure blob 存储读取内容。
  • 有关Azure SQL 托管实例的示例,请参阅使用 OPENROWSET 查询数据源。
  • 有关 Azure Synapse 中无服务器 SQL 池的信息和示例,请参阅 如何在 Azure Synapse Analytics 中使用无服务器 SQL 池使用 OPENROWSET。
  • Azure Synapse 中的专用 SQL 池不支持该 OPENROWSET 函数。

Transact-SQL 语法约定

语法

OPENROWSET 语法用于查询外部数据源:

OPENROWSET
(  'provider_name'
    , { 'datasource' ; 'user_id' ; 'password' | 'provider_string' }
    , {  [ catalog. ] [ schema. ] object | 'query' }
)

OPENROWSET(BULK) 语法用于读取外部文件:

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

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

   -- bulk_options related to input file format
   [ , CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' } ]
   [ , FORMAT = { 'CSV' | 'PARQUET' | 'DELTA' } ]
   [ , FIELDQUOTE = 'quote_characters' ]
   [ , 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 ] ]

参数

常用参数

'provider_name'

一个字符串,表示注册表中指定的 OLE DB 访问接口的友好名称(或 PROGID)。 provider_name 没有默认值 。 提供程序名称示例是 Microsoft.Jet.OLEDB.4.0SQLNCLIMSDASQL

'datasource'

对应于特定 OLE DB 数据源的字符串常量。 数据源DBPROP_INIT_DATASOURCE 要传递给 IDBProperties 提供程序接口以初始化提供程序的属性。 通常,此字符串包括数据库文件的名称、数据库服务器的名称或提供程序了解用于查找数据库或数据库的名称。

数据源可以是 C:\SAMPLES\Northwind.mdb' 提供程序的文件路径 Microsoft.Jet.OLEDB.4.0,也可以是 Server=Seattle1;Trusted_Connection=yes; 提供程序的连接字符串 SQLNCLI

'user_id'

一个字符串常量,该常量是传递给指定 OLE DB 访问接口的用户名。 user_id指定连接的安全上下文,并作为DBPROP_AUTH_USERID属性传入以初始化提供程序。 user_id不能是 windows 登录名Microsoft。

'password'

一个字符串常量,该常量是要传递给 OLE DB 访问接口的用户密码。 初始化提供程序时,密码 作为属性传入 DBPROP_AUTH_PASSWORD密码 不能Microsoft Windows 密码。

SELECT a.* FROM OPENROWSET(
    'Microsoft.Jet.OLEDB.4.0',
    'C:\SAMPLES\Northwind.mdb';
    'admin';
    'password',
    Customers
) AS a;

'provider_string'

作为属性传入DBPROP_INIT_PROVIDERSTRING的特定于提供程序的连接字符串,用于初始化 OLE DB 访问接口。 provider_string 通常封装初始化提供程序所需的所有连接信息 。 有关 SQL Server Native Client OLE DB 访问接口识别的关键字列表,请参阅初始化和授权属性(Native Client OLE DB Provider)。

SELECT d.* FROM OPENROWSET(
    'SQLNCLI',
    'Server=Seattle1;Trusted_Connection=yes;',
    Department
) AS d;

table_or_view<>

包含 OPENROWSET 应读取的数据的远程表或视图。 它可以是包含以下组件的三部分名称对象:

  • catalog(可选)- 指定对象所在的目录或数据库的名称 。
  • schema(可选)- 架构名称或指定对象的对象所有者名称 。
  • object - 对象名称,唯一地标识出将要操作的对象 。
SELECT d.* FROM OPENROWSET(
    'SQLNCLI',
    'Server=Seattle1;Trusted_Connection=yes;',
    AdventureWorks2022.HumanResources.Department
) AS d;

'query'

发送到提供程序和执行的字符串常量。 SQL Server 的本地实例不处理此查询,但处理提供程序返回的查询结果(传递查询)。 传递查询在提供程序上使用时非常有用,这些提供程序不通过表名提供其表格数据,而只能通过命令语言使用。 只要查询提供程序支持 OLE DB Command 对象及其强制接口,那么在远程服务器上就支持传递查询。 有关详细信息,请参阅 SQL Server Native Client (OLE DB) 接口

SELECT a.*
FROM OPENROWSET(
    'SQLNCLI',
    'Server=Seattle1;Trusted_Connection=yes;',
    'SELECT TOP 10 GroupName, Name FROM AdventureWorks2022.HumanResources.Department'
) AS a;

BULK 参数

BULK使用行集提供程序OPENROWSET从文件读取数据。 在 SQL Server 中,可以从数据文件中读取数据, OPENROWSET 而无需将数据加载到目标表中。 这使你可以与基本OPENROWSET语句一起使用SELECT

重要

Azure SQL 数据库仅支持从 Azure blob 存储读取内容。

该选项的参数 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 存储中批量访问数据的示例。

重要

Azure SQL 数据库仅支持从 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

MAXERRORS = maximum_errors

指定格式化文件中定义的最大语法错误数或不符合的行数,在引发异常之前 OPENROWSET 可能发生。 在到达之前 MAXERRORSOPENROWSET 请忽略每个错误的行,不加载该行,并将错误行计数为一个错误。

默认 maximum_errors 为 10 。

注意

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

BULK 数据处理选项

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

指定数据文件没有重复条目。

如果数据文件中的实际行未根据指定的顺序进行排序,或者 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 值 说明
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 标准中定义的引号字符。

注解

仅当 DisallowAdhocAccess 注册表选项针对指定的提供程序显式设置为 0,并且启用 Ad Hoc Distributed Queries 高级配置选项时,OPENROWSET 才可用于访问 OLE DB 数据源中的远程数据 。 如果未设置这些选项,则默认行为不允许临时访问。

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

如果 OLE DB 访问接口在指定的数据源中支持多个目录和架构,那么就需要目录及架构名称。 当 OLE DB 提供程序不支持它们时,可以省略目录架构的值。 如果提供程序只支持架构名称,那么必须指定一个格式为 schema.object 的两部分名称 。 如果提供程序只支持目录名称,那么必须指定一个格式为 catalog.schema.object 的三部分名称 。 必须为使用 SQL Server Native Client OLE DB 提供程序的传递查询指定由三部分组成的名称。 有关详细信息,请参阅 Transact-SQL 语法约定

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 权限由传递给 OLE DB 访问接口的用户名的权限确定。 使用 BULK 选项需要 ADMINISTER BULK OPERATIONSADMINISTER DATABASE BULK OPERATIONS 权限。

示例

本部分提供一般示例,演示如何使用 OPENROWSET。

A. 将 OPENROWSET 与 SELECT 和 SQL Server Native Client OLE DB 提供程序配合使用

仅适用于: SQL Server。

已从 SQL Server 2022 (16.x) 和 SQL Server Management Studio 19 (SSMS) 中移除 SQL Server Native Client(通常缩写为 SNAC)。 不建议在新的开发工作中使用 SQL Server Native Client OLE DB 提供程序(SQLNCLI 或 SQLNCLI11)和旧版 Microsoft OLE DB Provider for SQL Server (SQLOLEDB)。 此后请切换到新的 Microsoft OLE DB Driver (MSOLEDBSQL) for SQL Server

以下示例使用 SQL Server Native Client OLE DB 提供程序访问 HumanResources.Department 表,该表位于远程服务器 AdventureWorks2022 上的 Seattle1 数据库中。 (使用 SQLNCLI 并且 SQL Server 将重定向到 SQL Server Native Client OLE DB 访问接口的最新版本。)使用 SELECT 语句定义返回的行集。 访问接口字符串包含 ServerTrusted_Connection 关键字。 这些关键字由 SQL Server Native Client OLE DB 提供程序识别。

SELECT a.*
FROM OPENROWSET(
    'SQLNCLI', 'Server=Seattle1;Trusted_Connection=yes;',
    'SELECT GroupName, Name, DepartmentID
         FROM AdventureWorks2022.HumanResources.Department
         ORDER BY GroupName, Name'
) AS a;

B. 使用适用于 Jet 的 Microsoft OLE DB 提供程序

仅适用于: SQL Server。

以下示例通过 Microsoft OLE DB Provider for Jet 访问 Microsoft Access Customers 数据库中的 Northwind 表。

注意

此示例假定已安装 Microsoft Access。 若要运行此示例,必须安装 Northwind 数据库。

SELECT CustomerID, CompanyName
FROM OPENROWSET(
    'Microsoft.Jet.OLEDB.4.0',
    'C:\Program Files\Microsoft Office\OFFICE11\SAMPLES\Northwind.mdb';
    'admin';'',
    Customers
);

重要

Azure SQL 数据库仅支持从 Azure blob 存储读取内容。

°C 使用 INNER JOIN 中的 OPENROWSET 和另一个表

仅适用于: SQL Server。

以下示例从 SQL Server Customers 数据库本地实例中的 Northwind 表以及存储在同一计算机上的 Access Orders 数据库中的 Northwind 表中选择所有数据。

注意

此示例假定已经安装了 Access。 若要运行此示例,必须安装 Northwind 数据库。

USE Northwind;
GO

SELECT c.*, o.*
FROM Northwind.dbo.Customers AS c
INNER JOIN OPENROWSET(
        'Microsoft.Jet.OLEDB.4.0',
        'C:\Program Files\Microsoft Office\OFFICE11\SAMPLES\Northwind.mdb';'admin';'',
        Orders) AS o
    ON c.CustomerID = o.CustomerID;

重要

Azure SQL 数据库仅支持从 Azure blob 存储读取内容。

D. 使用 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

重要

Azure SQL 数据库仅支持从 Azure blob 存储读取内容。

E. 使用带格式化文件的 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;

重要

Azure SQL 数据库仅支持从 Azure blob 存储读取内容。

F. 指定格式化文件和代码页

仅适用于: SQL Server。

以下示例演示如何同时使用格式化文件和代码页选项。

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

G. 使用格式化文件从 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;

重要

Azure SQL 数据库仅支持从 Azure blob 存储读取内容。

H. 在没有格式化文件的情况下从 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一起使用。

I. 从存储在 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 存储中批量访问数据的示例。

J. 从存储在 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 = 'YourStrongPassword1';
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;

重要

Azure SQL 数据库仅支持从 Azure blob 存储读取内容。

K. 将托管标识用于外部源

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

以下示例使用托管标识创建凭据,创建外部源,然后从托管在外部源上的 CSV 加载数据。

首先,创建凭据并将 Blob 存储指定为外部源:

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

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

接下来,从托管在 Blob 存储上的 CSV 文件加载数据:

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

重要

Azure SQL 数据库仅支持从 Azure blob 存储读取内容。

L. 使用 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;

M. 使用 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;

更多示例

有关显示使用 INSERT...SELECT * FROM OPENROWSET(BULK...)的示例,请参阅以下文章: