Azure Synapse SQL 中支持的 Transact-SQL 功能
Azure Synapse SQL 是一个大数据分析服务,可让你使用 T-SQL 语言查询和分析数据。 可以使用对 SQL Server 和 Azure SQL 数据库使用的 SQL 语言的、符合 ANSI 规范的标准方言进行数据分析。
Transact-SQL 语言在无服务器 SQL 池中使用,专用模型可以引用不同的对象,但在支持的功能集方面存在一些差异。 本页概要描述了 Synapse SQL 的使用模型之间的 Transact-SQL 语言差异。
数据库对象
借助 Synapse SQL 中的使用模型,可以使用不同的数据库对象。 下表显示了受支持对象类型的比较:
对象 | 专用 | 无服务器 |
---|---|---|
表 | 是 | 否,不支持数据库内表。 无服务器 SQL 池只能查询那些引用存储在 Azure Data Lake 存储或 Dataverse 中的数据的外部表。 |
视图 | 是 视图可以使用在专用模型中可用的查询语言元素。 | 是,可以通过外部表、使用OPENROWSET 函数的查询以及其他视图来创建视图。 视图可以使用在无服务器模型中可用的查询语言元素。 |
架构 | 是 | 是,支持架构。 使用架构隔离不同的租户,并按架构放置其表格。 |
临时表 | 是 | 临时表可能仅用于存储系统视图、文本或其他临时表中的某些信息。 还支持临时表上的 UPDATE/DELETE 操作。 可以将临时表与系统视图联接在一起。 不能从外部表中选择数据并将其插入临时表或将临时表与外部表联接起来 - 这些操作会失败,因为不能在同一查询中混用外部数据和临时表。 |
用户定义的过程 | 是 | 是,存储过程可以放置在任何用户数据库(非 master 数据库)中。 过程只能读取外部数据并使用无服务器池中可用的查询语言元素。 |
用户定义的函数 | 是 | 是,仅支持内联表值函数。 不支持标量用户定义的函数。 |
触发器 | 否 | 否,无服务器 SQL 池不支持更改数据,因此触发器无法对数据更改做出反应。 |
外部表 | 是 请参阅受支持的数据格式。 | 是的,有外部表可用于从 Azure Data Lake 存储或 Dataverse 中读取数据。 请参阅受支持的数据格式。 |
缓存查询 | 是,支持多个形式(基于 SSD 的缓存、内存中缓存和结果集缓存)。 此外,还支持具体化视图。 | 否,只缓存文件统计信息。 |
结果集缓存 | 是 | 否,不会缓存查询结果。 只缓存文件统计信息。 |
具体化视图 | 是 | 否,无服务器 SQL 池中不支持具体化视图。 |
表变量 | 否,使用临时表 | 否,不支持表变量。 |
表分发 | 是 | 否,不支持表分发。 |
表索引 | 是 | 否,不支持索引。 |
表分区 | 是 | 外部表不支持分区。 可以使用 Hive 分区文件夹结构对文件进行分区,并在 Spark 中创建已分区表。 Spark 分区将与无服务器池同步。 如果不使用 Spark,可以在文件夹结构中对文件进行分区,并可以在文件夹分区结构上创建已分区视图,但不能在已分区文件夹中创建外部表。 |
统计信息 | 是 | 是,统计信息在外部文件上创建。 |
工作负载管理、资源类和并发控制 | 是,请参阅工作负载管理、资源类和并发控制。 | 不可以,你无法管理分配给查询的资源。 无服务器 SQL 池自动管理资源。 |
成本控制 | 是,使用纵向扩展和纵向缩减操作。 | 是的,可以使用 Azure 门户或 T-SQL 过程来限制无服务器池的每日、每周或每月使用情况。 |
查询语言
Synapse SQL 中使用的查询语言可能有不同的受支持功能,具体取决于使用模型。 下表概述了 Transact-SQL 方言中最重要的查询语言差异:
语句 | 专用 | 无服务器 |
---|---|---|
SELECT 语句 | 是的。 支持 SELECT 语句,但不支持某些 Transact-SQL 查询子句,如 FOR XML/FOR JSON、MATCH、OFFSET/FETCH。 |
是,支持 SELECT 语句,但不支持某些 Transact-SQL 查询子句,如 FOR XML、MATCH、PREDICT、GROUPNG SETS 和查询提示。 |
INSERT 语句 | 是 | 否。 使用 Spark 或其他工具将新数据上传到 Data Lake。 将 Azure Cosmos DB 与分析存储一起用于高度事务性工作负载。 可以使用 CETAS 创建外部表并插入数据。 |
UPDATE 语句 | 是 | 否,使用 Spark 更新 Parquet/CSV 数据,更改将在无服务器池中自动生效。 将 Azure Cosmos DB 与分析存储一起用于高度事务性工作负载。 |
DELETE 语句 | 是 | 否,使用 Spark 删除 Parquet/CSV 数据,更改将在无服务器池中自动生效。 将 Azure Cosmos DB 与分析存储一起用于高度事务性工作负载。 |
MERGE 语句 | 是(预览版) | 否,使用 Spark 合并 Parquet/CSV 数据,更改将在无服务器池中自动生效。 |
CTAS 语句 | 是 | 否,CREATE TABLE AS SELECT 语句在无服务器 SQL 池中不受支持。 |
CETAS 语句 | 是,可以使用 CETAS 执行初始加载并加载到外部表中。 | 是,可以使用 CETAS 执行初始加载并加载到外部表中。 CETAS 支持 Parquet 和 CSV 输出格式。 |
事务 | 是 | 是,事务仅适用于元数据对象。 |
标签 | 是 | 否,无服务器 SQL 池中不支持标签。 |
数据加载 | 是的。 首选的实用工具是 COPY 语句,但系统支持使用 BULK load (BCP) 和 CETAS 加载数据。 | 否,无法将数据加载到无服务器 SQL 池中,因为数据存储在外部存储中。 首次可以使用 CETAS 语句将数据加载到外部表中。 |
数据导出 | 是的。 使用 CETAS。 | 是的。 可以使用 CETAS 将数据从外部存储(Azure Data Lake、Dataverse、Azure Cosmos DB)导出到 Azure Data Lake 中。 |
类型 | 是,支持除 cursor、hierarchyid、ntext、text 和 image、rowversion、空间类型、sql_variant 和 xml 以外的所有 Transact-SQL 类型 | 是,支持除 cursor、hierarchyid、ntext、text 和 image、rowversion、空间类型、sql_variant、xml 和 Table 类型以外的所有 Transact-SQL 类型. 请参阅此处的如何将 Parquet 列类型映射到 SQL 类型。 |
跨数据库查询 | 否 | 是的,支持跨数据库查询和第三方名称引用,包括 USE 语句。 查询可以引用同一工作区中的无服务器 SQL 数据库或 Lake 数据库。 不支持跨工作区查询。 |
内置/系统函数(分析) | 是,支持除 CHOOSE 和 PARSE 以外的所有 Transact-SQL 分析、转换、日期和时间、逻辑和数学函数 | 是,支持所有 Transact-SQL 分析、转换、日期和时间、逻辑和数学函数。 |
内置/系统函数(字符串) | 是的。 除 STRING_ESCAPE 和 TRANSLATE 以外的所有 Transact-SQL 字符串、JSON 和排序规则函数 | 是的。 支持所有 Transact-SQL 字符串、JSON 和排序规则函数。 |
内置/系统函数(加密) | 一些 | HASHBYTES 是无服务器 SQL 池中唯一受支持的加密函数。 |
内置/系统表值函数 | 是,支持除 OPENXML、OPENDATASOURCE、OPENQUERY 和 OPENROWSET 以外的 Transact-SQL 行集函数 | 是,支持除 OPENXML、OPENDATASOURCE 和 OPENQUERY 以外的所有 Transact-SQL 行集函数。 |
内置/系统聚合 | 除 CHECKSUM_AGG 和 GROUPING_ID 以外的 Transact-SQL 内置聚合 | 是,支持所有 Transact-SQL 内置聚合。 |
运算符 | 是,支持除 !> 和 !< 以外的所有 Transact-SQL 运算符 | 是,支持所有 Transact-SQL 运算符。 |
流控制 | 是的。 除 CONTINUE、GOTO、RETURN、USE 和 WAITFOR 以外的所有 Transact-SQL 流控制语句 | 是的。 支持所有 Transact-SQL 控制流语句。 不支持 WHILE (...) 条件中的 SELECT 查询。 |
DDL 语句(CREATE、ALTER、DROP) | 是的。 适用于受支持对象类型的所有 Transact-SQL DDL 语句 | 是,支持所有适用于支持的对象类型的 Transact-SQL DDL 语句。 |
安全性
Synapse SQL 池可让你使用内置安全功能来保护数据和控制访问。 下表概要比较了 Synapse SQL 使用模型之间的差异。
Feature | 专用 | 无服务器 |
---|---|---|
登录名 | 不适用(数据库中仅支持包含的用户) | 是,支持服务器级 Microsoft Entra ID 和 SQL 登录。 |
用户 | 不适用(数据库中仅支持包含的用户) | 是,支持数据库用户。 |
包含的用户 | 是的。 注意:只能分配一个 Microsoft Entra 用户作为非受限管理员 | 否,不支持包含的用户。 |
SQL 用户名/密码身份验证 | 是 | 是,用户可以使用其用户名和密码访问无服务器 SQL 池。 |
Microsoft Entra 身份验证 | 是,Microsoft Entra 用户 | 是,Microsoft Entra 登录名和用户可以使用其 Microsoft Entra 标识访问无服务器 SQL 池。 |
存储 Microsoft Entra 直通身份验证 | 是 | 是,Microsoft Entra 直通身份验证适用于 Microsoft Entra 登录。 如果未指定凭据,则会将 Microsoft Entra 用户的标识传递给存储。 Microsoft Entra 直通身份验证不适用于 SQL 用户。 |
存储共享访问签名 (SAS) 令牌身份验证 | 否 | 是,在 EXTERNAL DATA SOURCE 中结合使用 DATABASE SCOPED CREDENTIAL 和共享访问签名令牌,或结合使用实例级 CREDENTIAL 和共享访问签名。 |
存储访问密钥身份验证 | 是,在 EXTERNAL DATA SOURCE 中使用 DATABASE SCOPED CREDENTIAL | 否,使用 SAS 令牌而不是存储访问密钥。 |
存储托管标识身份验证 | 是,使用托管服务标识凭据 | 是,查询可以使用工作区托管标识凭据来访问存储。 |
存储应用程序标识/服务主体 (SPN) 身份验证 | 是 | 是,可以使用服务主体应用程序 ID 创建凭证,该凭证将用于在存储上进行身份验证。 |
服务器角色 | 否 | 是,支持 sysadmin 角色、public 角色和其他服务器角色。 |
服务器级别凭据 | 否 | 是,服务器级别凭据供不使用显式数据源的 OPENROWSET 函数使用。 |
权限 - 服务器级别 | 否 | 是,例如 CONNECT ANY DATABASE 和 SELECT ALL USER SECURABLES 使用户能够读取任何数据库中的数据。 |
数据库角色 | 是 | 是,可以使用 db_owner 、db_datareader 和 db_ddladmin 角色。 |
DATABASE SCOPED CREDENTIAL | 是,在外部数据源中使用。 | 是,可以在外部数据源中使用数据库范围的凭据来定义存储身份验证方法。 |
权限 - 数据库级别 | 是 | 可以授予、拒绝或撤消对数据库对象的权限。 |
权限 - 架构级别 | 是,包括能够授予、拒绝和撤销用户/登录名对架构的权限 | 是,可以指定架构级别的权限,包括向架构上的用户/登录名授予、拒绝和撤消权限的能力。 |
权限 - 对象级别 | 是,包括能够授予、拒绝和撤销用户的权限 | 是,可以向支持的系统对象上的用户/登录名授予、拒绝和撤消权限。 |
权限 - 列级安全性 | 是 | 视图的无服务器 SQL 池不支持列级安全性,而不支持外部表。 对于外部表,可以基于外部表创建逻辑视图,而不是应用列级安全性。 |
行级安全 | 是 | 没有,对行级别安全性没有内置支持。 将自定义视图作为解决方法。 |
数据屏蔽 | 是 | 不能,无服务器 SQL 池中不支持内置数据掩码。 使用显式屏蔽某些列的包装器 SQL 视图作为解决方法。 |
内置/系统安全性函数和标识函数 | 部分 Transact-SQL 安全性函数和运算符:CURRENT_USER 、HAS_DBACCESS 、IS_MEMBER 、IS_ROLEMEMBER 、SESSION_USER 、SUSER_NAME 、SUSER_SNAME 、SYSTEM_USER 、USER 、USER_NAME 、EXECUTE AS 、OPEN/CLOSE MASTER KEY |
支持部分 Transact-SQL 安全性函数和运算符:CURRENT_USER 、HAS_DBACCESS 、HAS_PERMS_BY_NAME 、IS_MEMBER 、IS_ROLEMEMBER 、IS_SRVROLEMEMBER 、SESSION_USER 、SESSION_CONTEXT 、SUSER_NAME 、SUSER_SNAME 、SYSTEM_USER 、USER 、USER_NAME 、EXECUTE AS 和 REVERT 。 安全性函数不可用于查询外部数据(将结果存储在可在查询中使用的变量中)。 |
透明数据加密 (TDE) | 是 | 否,不支持透明数据加密。 |
数据发现和分类 | 是 | 否,不支持数据发现和分类。 |
漏洞评估 | 是 | 否,无法执行漏洞评估。 |
高级威胁防护 | 是 | 否,不支持高级威胁防护。 |
审核 | 是 | 是,无服务器 SQL 池中支持审核。 |
防火墙规则 | 是 | 是,可以在无服务器 SQL 终结点上设置防火墙规则。 |
专用终结点 | 是 | 是,可以在无服务器 SQL 池上设置专用终结点。 |
专用 SQL 池和无服务器 SQL 池使用标准 Transact-SQL 语言来查询数据。 有关详细差异,请查看 Transact-SQL 语言参考。
平台功能
Feature | 专用 | 无服务器 |
---|---|---|
扩展 | 是 | 无服务器 SQL 池会根据工作负载自动缩放。 |
暂停/恢复 | 是 | 无服务器 SQL 池在不使用时会自动停用,并在需要时激活。 不需要用户执行任何操作。 |
数据库备份 | 是 | 否。 数据存储在外部系统(ADLS、Cosmos DB)中,因此请确保在源位置备份数据。 确保在源代码管理中使用存储 SQL 元数据(表、视图、过程定义和用户权限)。 湖数据库中的表定义存储在 Spark 元数据中,因此请确保在源代码管理中也保留 Spark 表定义。 |
数据库还原 | 是 | 否。 数据存储在外部系统(ADLS、Cosmos DB)中,因此需要恢复源系统才能引入数据。 确保 SQL 元数据(表、视图、过程定义和用户权限)位于源代码管理中,以便能够重新创建 SQL 对象。 湖数据库中的表定义存储在 Spark 元数据中,因此请确保在源代码管理中也保留 Spark 表定义。 |
工具
可以使用各种工具连接到 Synapse SQL 来查询数据。
工具 | 专用 | 无服务器 |
---|---|---|
Synapse Studio | 是,SQL 脚本 | 是,可以在 Synapse Studio 中使用 SQL 脚本。 如果要返回大量数据作为结果,请使用 SSMS 或 ADS,而不是 Synapse Studio。 |
Power BI | 是 | 是,可以使用 Power BI 在无服务器 SQL 池上创建报表。 建议为报表使用导入模式。 |
Azure Analysis Service | 是 | 是,可以使用无服务器 SQL 池在 Azure Analysis Service 中加载数据。 |
Azure Data Studio (ADS) | 是 | 是,可以使用 Azure Data Studio(1.18.0 或更高版本)查询无服务器 SQL 池。 支持 SQL 脚本和 SQL 笔记本。 |
SQL Server Management Studio (SSMS) | 是 | 是,可以使用 SQL Server Management Studio(版本 18.5 或更高版本)查询无服务器 SQL 池。 SSMS 仅显示无服务器 SQL 池中可用的对象。 |
注意
可以使用 SSMS 连接到无服务器 SQL 池并查询。 这从 18.5 版开始部分支持,仅可用于连接和查询。
大多数应用程序使用标准 Transact-SQL 语言来查询 Synapse SQL 的专用使用模型和无服务器使用模型。
数据访问
分析的数据可以存储在各种类型的存储中。 下表列出了所有可用的存储选项:
存储类型 | 专用 | 无服务器 |
---|---|---|
内部存储 | 是 | 否,数据放置在 Azure Data Lake 或 Azure Cosmos DB 分析存储中。 |
Azure Data Lake v2 | 是 | 是,可以使用外部表和 OPENROWSET 函数读取 ADLS 中的数据。 在此处了解如何设置访问控制。 |
Azure Blob 存储 | 是 | 是,可以使用外部表和 OPENROWSET 函数读取 Azure Blob 存储中的数据。 在此处了解如何设置访问控制。 |
Azure SQL/SQL Server(远程) | 否 | 否,无服务器 SQL 池无法引用 Azure SQL 数据库。 可以使用弹性查询或链接服务器从 Azure SQL 引用无服务器 SQL 池。 |
Dataverse | 否,可以使用无服务器 SQL 池中的 Azure Synapse Link(通过 ADLS)或 Spark 将 Azure Cosmos DB 数据加载到专用池中。 | 是,可以使用 Azure Synapse link for Dataverse 与 Azure Data Lake 读取 Dataverse 表。 |
Azure Cosmos DB 事务存储 | 否 | 否,无法访问 Azure Cosmos DB 容器来更新或读取 Azure Cosmos DB 事务存储中的数据。 使用 Spark 池更新 Azure Cosmos DB 事务存储。 |
Azure Cosmos DB 分析存储 | 否,可以使用无服务器 SQL 池中的 Azure Synapse Link(通过 ADLS)、ADF、Spark 或一些其他加载工具,将 Azure Cosmos DB 数据加载到专用池中。 | 是,可以使用 Azure Synapse Link查询 Azure Cosmos DB 分析存储。 |
Apache Spark 表(在工作区中) | 否 | 是,无服务器池可以使用元数据同步读取 PARQUET 和 CSV 表。 |
Apache Spark 表(远程) | 否 | 否,无服务器池只能访问在同一 Synapse 工作区中的 Apache Spark 池中创建的 PARQUET 和 CSV 表。 但是,可以手动创建引用外部 Spark 表位置的外部表。 |
Databricks 表(远程) | 否 | 否,无服务器池只能访问在同一 Synapse 工作区中的 Apache Spark 池中创建的 PARQUET 和 CSV 表。 但是,可以手动创建引用 Databricks 表位置的外部表。 |
数据格式
可以采用各种存储格式来存储分析的数据。 下表列出了可分析的所有可用数据格式:
数据格式 | 专用 | 无服务器 |
---|---|---|
带分隔符 | 是 | 是,可以查询分隔文件。 |
CSV | 是(不支持多字符分隔符) | 是,可以查询 CSV 文件。 为获得更好的性能,请使用 PARSER_VERSION 2.0,它提供了更快的分析。 如果要将行追加到 CSV 文件,请确保将文件作为可追加的文件进行查询。 |
Parquet | 是 | 是,可以查询 Parquet 文件,包括具有嵌套类型的文件。 |
Hive ORC | 是 | 否,无服务器 SQL 池无法读取 Hive ORC 格式。 |
Hive RC | 是 | 否,无服务器 SQL 池无法读取 Hive RC 格式。 |
JSON | 是 | 是,可以使用分隔文本格式和 T-SQL JSON函数查询 JSON 文件。 |
Avro | 否 | 否,无服务器 SQL 池无法读取 Avro 格式。 |
Delta Lake | 否 | 是,可以查询 delta lake 文件,包括具有嵌套类型的文件。 |
Common Data Model (CDM) | 否 | 否,无服务器 SQL 池无法读取使用 Common Data Model 存储的数据。 |
后续步骤
在以下文章中可以找到有关专用 SQL 池和无服务器 SQL 池最佳做法的更多信息: