Babelfish部分支持的功能示例
Babelfish 的每个迭代版本都在逐步扩展对 T-SQL 功能的支持范围,以提升兼容性。但当前版本仍存在部分未支持功能及行为差异。下文详细列出了 Babelfish 与 T-SQL 之间的功能差异,并提供相应解决方案和使用指南。
自 Babelfish 1.2.0 版本起,下列功能目前为有限支持状态:
视图
在Babelfish中不存在如下SQL Server系统视图,详情如表1。
|
视图名称 |
功能描述 |
|---|---|
|
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 Server和JSON 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参数。
- 使用sqlcmd命令行工具,执行以下命令进行连接。
sqlcmd -U babelfish_user -P 12345678 -No -y <textsize_value>
- 设置TEXTSIZE参数。
SET TEXTSIZE <textsize_value>
- 执行如下命令查询TEXTSIZE参数的值。
SELECT id, LEFT(name, CAST(current_setting('babelfishpg_tsql.textsize') as int )) AS name FROM <table_name>;SELECT * FROM <table_name>;
- 使用sqlcmd命令行工具,执行以下命令进行连接。
函数
如下函数存在差异。










