更新时间:2025-11-19 GMT+08:00
分享

Babelfish部分支持的功能示例

Babelfish 的每个迭代版本都在逐步扩展对 T-SQL 功能的支持范围,以提升兼容性。但当前版本仍存在部分未支持功能及行为差异。下文详细列出了 Babelfish 与 T-SQL 之间的功能差异,并提供相应解决方案和使用指南。

自 Babelfish 1.2.0 版本起,下列功能目前为有限支持状态:

视图

在Babelfish中不存在如下SQL Server系统视图,详情如表1

表1 Babelfish中不存在的SQL Server系统视图

视图名称

功能描述

sys.parameters

包含存储过程、函数等对象的参数信息。

sys.periods

存储时态表(历史表)的时间周期定义信息。

sys.service_queues

提供Service Broker服务队列的配置信息。

sys.sql_dependencies

记录数据库对象之间的依赖关系。

sys.stats_columns

显示统计信息关联的列信息。

sys.masked_columns

包含动态数据掩码应用的列信息。

sys.memory_optimized_tables_internal_attributes

内存优化表的内部属性信息。

sys.numbered_procedure_parameters

包含编号存储过程的参数信息。

sys.allocation_units

显示数据库中分配单元(存储结构)的信息。

sys.event_notifications

包含事件通知配置信息。

sys.extended_procedures

提供扩展存储过程信息。

sys.function_order_columns

包含CLR表值函数中顺序列的信息。

sys.trigger_event_types

列出触发器可以响应的事件类型。

无限值(Infinity Value)

Babelfish 支持 Infinity , SQL Server不支持。

ROWVERSION/TIMESTAMP 赋值行为差异

在 SQL Server 中,每插入(INSERT)或更新(UPDATE)一行均会分配唯一的 ROWVERSION/TIMESTAMP 值,而Babelfish在同一语句中修改的所有行将分配相同的 ROWVERSION/TIMESTAMP值。

例如,当执行影响多行的 UPDATE 或 INSERT SELECT操作时:

  • SQL Server 会为每一行的 ROWVERSION/TIMESTAMP 列生成不同值。
  • Babelfish (PostgreSQL) 会为所有受影响行赋予相同值。

上述细微差异通常不会对应用程序有负面影响。

对JSON数据类型提供有限兼容支持

Babelfish不直接支持SQL Server原生JSON数据类型。而是存储为NVARCHAR、VARCHAR或TEXT数据类型。更多详细信息请参考JSON data in SQL ServerJSON data type

以下JSON函数是Babelfish支持的函数,可以操作JSON:

  • JSON_VALUE
  • JSON_QUERY
  • OPENJSON
  • JSON_MODIFY
  • ISJSON

标识符差异

T-SQL中定义的索引名 ix1在表t1上,Babelfish会将其内部重命名为类似ix1t1a5111d2a1767bc43a700e9f2162be019 的形式(ix1t1 + 哈希值)。

  • T-SQL透明性:用户仍使用原始标识符编写查询,Babelfish自动映射到内部名称。
  • PostgreSQL可见性:在PostgreSQL端(如通过psql查看),实际对象名是包含哈希值的名称。

Babelfish通过哈希算法动态调整标识符,既兼容了SQL Server的长名称和宽松规则,又满足了PostgreSQL的严格限制。这种处理对T-SQL用户无感知,但需注意在PostgreSQL中看到的对象名会包含哈希后缀。更多详细信息参考Babelfish官方文档标识符描述

Babelfish中标识符差异对系统视图的影响:

  • 若对象名称<= 64个字符,通过SQL命令访问该对象无影响(use、select等SQL命令),且在sys.databases、sys.indexes、sys.table等系统视图中存储的是对象原始名称。
  • 若对象名称>64个字符,通过SQL命令访问该对象无影响(use、select等SQL命令),但在sys.databases、sys.indexes、sys.tables等系统视图中存储的是对象经过转换后的名称"部分前缀+hash值",且通过简单的字符串处理无法还原对象原始名称。

标识符差异的影响场景:

  • DRS在以Babelfish为目标端的迁移链路中,迁移开始前会对目标Babelfish实例进行预检查。预检查会根据sys.*系统视图查询对象是否已存在,如果源端SQL Server存在超过64个字符的数据库对象,则预检查会存在问题。
  • 用户的业务访问sys.*系统视图时,对于超过64字符的对象,也会存在查找无结果的问题。

系统视图表差异

如下视图存在差异:

参数

Babelfish不支持以下设置:

SET ANSI_NULL_DFLT_OFF ON

SET ANSI_NULL_DFLT_ON OFF

SET ANSI_PADDING OFF

SET ANSI_WARNINGS OFF

这将导致SET ANSI_DEFAULTS命令对于这些服务器端设置无法正常工作。

以下参数禁止修改:

更多详细内容请参考Babelfish官方文档-不应修改的参数

游标(cursors)

Babelfish中不支持SET CURSOR_Closed_ON_COMMIT ON。此外,Babelfish不识别在存储过程或函数中动态定义的游标。作为一种解决方法,您可以使用临时表重写此类游标。

也不支持以下游标类型和行为:

  • 可更新游标(Updatable cursors)
  • 全局游标(Global cursors)
  • 不支持游标提取行为:FETCH PRIOR, FIRST, LAST, ABSOLUTE, 和 RELATIVE 。
  • 游标类型的输出参数:游标类型的变量和参数不能用作输出参数(会引发错误)。
  • 光标选项:不支持以下选项:SCROLL, KEYSET, DYNAMIC, FAST_FORWARD, SCROLL_LOCKS, OPTIMISTIC, TYPE_WARNING, 和 FOR UPDATE。

此外,Babelfish社区文档指出:“当 ANSI_DEFAULTS 开启时,它会启用以下设置:ANSI_NULLS、ANSI_NULL_DFLT_ON、IMPLICIT_TRANSACTIONS、ANSI_PADDING、QUOTED_IDENTIFIER、ANSI_WARNINGS 和 CURSOR_CLOSE_ON_COMMIT。驱动程序和提供商将 CURSOR_CLOSE_ON_COMMIT 和 IMPLICIT_TRANSACTIONS 设置为 OFF(因此CURSOR_CLOSE_ON_COMMIT 实际上在连接时处于 OFF 状态,尽管 ANSI_DEFAULTS 处于 ON 状态)”。

命令

  • SET STATISTICS 和SET STATISTICS_ALL 不支持,但是有代替的功能:
    • SET BABELFISH_STATISTICS PROFILE [ON|OFF]:对于实际查询执行计划,设置为 ON,此函数实现了PostgreSQL 命令EXPLAIN ANALYZE 的功能。
    • SET BABELFISH_SHOWPLAN_ALL [ON|OFF] :设置为 ON 可生成估计的查询执行计划,此函数实现 PostgreSQL 的 EXPLAIN 命令的行为,使用此命令获取给定查询的解释计划。

    另外,babelfish社区文档中表示:“从版本 2.2.0 开始,您可以将 escape_hatch_showplan_all 参数设置为 ignore,以避免在 SQL Server 语法中对 SHOWPLAN_ALL 和 STATISTICS PROFILE SET 命令使用 BABELFISH_ 前缀。”

    因此,为了将其用作不带 BABELFISH 前缀的 SET SHOWPLAN_ALL 和 SET STATISTICS PROFILE 应该运行:

    EXEC sp_babelfish_configure 'babelfishpg_tsql.escape_hatch_showplan_all', 'ignore';

    或:

    EXEC sp_babelfish_configure 'babelfishpg_tsql.escape_hatch_showplan_all', 'strict';

    可以使用 sp_babelfish_configure 更改参数的设置,如下例所示:

    execute sp_babelfish_configure 'explain_buffers', 'on'; 
  • Babelfish不支持SET SHOWPLAN_XML

    Babelfish可以输出查询计划,并且可以以 XML 格式输出查询计划。详细信息请参考文档了解如何查看Babelfish 查询计划。

    在运行查询之前,您可以使用以下方法可视化STATISTICS PROFILE,可视化时需执行SET BABELFISH_STATISTICS PROFILE ON。

    • 执行如下命令设置说明格式。
       execute sp_babelfish_configure 'explain_format', 'xml'
    • 执行如下命令进行可视化。
      select set_config('babelfishpg_tsql.explain_format', 'xml', false);
      SET BABELFISH_STATISTICS PROFILE ON;
  • Babelfish 不支持SET FORCEPLAN。
  • Babelfish 不支持SET SHOWPLAN_TEXT。
  • 对于SET NOEXEC,Babelfish只支持"OFF”,更多详细信息请参考Babelfish限制社区文档
  • Babelfish不支持SET TEXTSIZE功能,但有代替功能,如下:

    Babelfish在会话初始化时,将TEXTSIZE参数设置为4096。如果要更改它,按如下操作:

    如果将 “-y” 参数设置为小于 “TEXTSIZE” 值,则无法调整输出的文本大小,这种情况下,优先考虑-y参数。

    1. 使用sqlcmd命令行工具,执行以下命令进行连接。
      sqlcmd -U babelfish_user -P 12345678 -No -y <textsize_value>
    2. 设置TEXTSIZE参数。
      SET TEXTSIZE <textsize_value>
    3. 执行如下命令查询TEXTSIZE参数的值。
      SELECT id, LEFT(name, CAST(current_setting('babelfishpg_tsql.textsize') as int )) AS name FROM <table_name>; 
      SELECT * FROM <table_name>;

函数

如下函数存在差异。

相关文档