

# Babelfish 中的 T-SQL 差异
<a name="babelfish-compatibility.tsql.limitations"></a>

下面，您可以找到当前版本 Babelfish 支持的 T-SQL 功能表，其中包含一些关于行为与 SQL Server 行为差异的注释。

有关各种版本支持的更多信息，请参阅[Babelfish 的各个版本支持的功能](babelfish-compatibility.supported-functionality-table.md)。有关当前不支持功能的信息，请参阅[Babelfish 中不支持的功能](babelfish-compatibility.tsql.limitations-unsupported.md)。

Babelfish 可用于 Aurora PostgreSQL 兼容版。有关 Babelfish 版本的更多信息，请参阅 [https://docs.aws.amazon.com/AmazonRDS/latest/AuroraPostgreSQLReleaseNotes/Welcome.html](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraPostgreSQLReleaseNotes/Welcome.html)。


| 功能或语法 | 行为或差异的描述 | 
| --- | --- | 
| \$1（行延续字符） | 当前不支持字符串和十六进制字符串的行延续字符（换行符前的反斜杠）。对于字符串，反斜杠换行符被解释为字符串中的字符。对于十六进制字符串，反斜杠换行符会导致语法错误。 | 
| @@version | `@@version` 返回的值的格式与 SQL Server 返回的值略有不同。如果您的代码取决于 `@@version` 的格式化，可能无法正常工作。 | 
| 聚合函数 | 部分支持聚合函数（支持 AVG、COUNT、COUNT\$1BIG、GROUPING、MAX、MIN、STRING\$1AGG 和 SUM）。有关不支持聚合函数的列表，请参阅[不支持的函数](babelfish-compatibility.tsql.limitations-unsupported.md#babelfish-compatibility.tsql.limitations-unsupported-list4)。 | 
|  ALTER TABLE  | 仅支持添加或删除单个列或约束。 | 
|  ALTER TABLE..ALTER COLUMN  | 目前无法指定 NULL 和 NOT NULL。要更改列是否可为 null 值，请使用 PostgreSQL 语句 ALTER TABLE..\$1SET\$1DROP\$1 NOT NULL。 | 
|  AT TIME ZONE  | 在从夏令时（DST）过渡到标准时间期间，将使用标准时间偏移显示重叠的时段。为了澄清，请考虑以下示例： <pre>SELECT CONVERT(DATETIME2(0), '2022-10-30T02:00:00', 126) AT TIME ZONE 'Central European Standard Time';<br />GO;<br />Result: 2022-10-30 02:00:00 +01:00</pre>  | 
| 没有列别名的空白列名 | `sqlcmd` 和 `psql` 实用程序以不同方式处理空名的列： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/AuroraUserGuide/babelfish-compatibility.tsql.limitations.html)  | 
| CHECKSUM 函数 | Babelfish 和 SQL Server 对 CHECKSUM 函数使用不同的哈希算法。因此，由 Babelfish 中的 CHECKSUM 函数生成的哈希值可能与由 SQL Server 中的 CHECKSUM 函数生成的哈希值不同。 | 
| 列原定设置 | 创建列原定设置时，约束名称将被忽略。要删除列原定设置，请使用以下语法：`ALTER TABLE...ALTER COLUMN..DROP DEFAULT...` | 
| Constraint\$1name | 在 SQL Server 中，约束名称在表所属的架构中必须是唯一的。但是，在 Babelfish 中，这仅适用于 PRIMARY KEY 和 UNIQUE 约束。其它类型的约束不受此限制所限。 | 
| 约束 | PostgreSQL 不支持打开和关闭单个约束条件。将忽略语句，并发出警告。 | 
| 具有 IGNORE\$1DUP\$1KEY 的约束 | 不使用此属性创建约束。 | 
| CREATE、ALTER、DROP SERVER ROLE |  ALTER SERVER ROLE 仅支持 `sysadmin`。不支持所有其他语法。 对于登录（服务器主体）、数据库和数据库用户（数据库主体）的概念，Babelfish 中的 T-SQL 用户的体验类似于 SQL Server。  | 
| CREATE、ALTER LOGIN 子句支持有限的语法 | 支持 CREATE LOGIN... PASSWORD 子句、...DEFAULT\$1DATABASE 子句和 ...DEFAULT\$1LANGUAGE 子句。支持 ALTER LOGIN... PASSWORD 子句，但 ALTER LOGIN... OLD\$1PASSWORD 子句不受支持。只有系统管理员成员的登录名才能修改密码。 | 
| CREATE DATABASE 区分大小写的排序规则  | CREATE DATABASE 语句不支持区分大小写的排序规则。 | 
| CREATE DATABASE 关键字和子句 | 不支持 COLLATE 和 CONTAINMENT=NONE 以外的选项。COLLATE 子句被接受并且始终设置为 `babelfishpg_tsql.server_collation_name` 的值。 | 
| CREATE SCHEMA... 支持子句 | 您可以使用 CREATE SCHEMA 命令创建空架构。使用其他命令创建架构对象。 | 
| Babelfish 上的数据库 ID 值不同  |  主数据库和 tempdb 数据库将不是数据库 ID 1 和 2。  | 
|  支持 FORMAT 日期类型函数，但存在以下限制 | 不支持单字符子午线。 对于大于 1000 的年份，SQL Server 中的“yyy”格式返回 4 位数，但对于其他年份，只返回 3 位数字。 不支持“g”和“R”格式 “vi-VN”区域设置翻译略有不同。 | 
| 超过 63 个字符的标识符 | PostgreSQL 最多为标识符支持 63 个字符。Babelfish 将长度超过 63 个字符的标识符转换为包含原名哈希的名称。例如，创建为“AB(ABC1234567890123456789012345678901234567890123456789012345678901234567890”的表可能转换为“ABC123456789012345678901234567890123456789012345678901234567890”。 | 
| IDENTITY 列支持 | IDENTITY 列支持数据类型 tinyint、smallint、int、bigint。numeric 和 decimal。SQL Server 为 IDENTITY 列中的数据类型 `numeric` 和 `decimal` 支持的精度达到 38 位。PostgreSQL 为 IDENTITY 列中的数据类型 `numeric` 和 `decimal` 支持的精度达到 19 位。 | 
| 使用 IGNORE\$1DUP\$1KEY 的索引 | 创建包含 IGNORE\$1DUP\$1KEY 的索引的语法会创建一个索引，就像省略此属性一样。 | 
| 包含 32 列以上的索引 | 索引不能包含超过 32 列。包含的索引列在 PostgreSQL 中计入最大值，但在 SQL Server 中不计。 | 
| 索引（聚集） | 聚集索引的创建就像指定了 NONCLUSTERED 一样。 | 
| 索引子句 | 忽略以下子句：FILLFACTOR、ALLOW\$1PAGE\$1LOCKS、ALLOW\$1ROW\$1LOCKS、PAD\$1INDEX、STATISTICS\$1NORECOMPUTE、OPTIMIZE\$1FOR\$1SEQUENTIAL\$1KEY、SORT\$1IN\$1TEMPDB、DROP\$1EXISTING、ONLINE、COMPRESSION\$1DELAY、MAXDOP 和 DATA\$1COMPRESSION | 
| JSON 支持 |  不能保证名称/值对的顺序。但数组类型保持不受影响。 | 
| LOGIN 对象 | 不支持 LOGIN 对象以外的所有选项，但以下各项除外：PASSWORD、DEFAULT\$1DATABASE、DEFAULT\$1LANGUAGE、ENABLE、DISABLE。 | 
| NEWSEQUENTIALID 函数 | 作为 NEWID 实施；不保证顺序行为。调用 `NEWSEQUENTIALID` 时，PostgreSQL 会生成一个新的 GUID 值。 | 
| 支持 OUTPUT 子句，但存在以下限制 | 同一个 DML 查询中不支持 OUTPUT 和 OUTPUT INTO。不支持在 OUTPUT 子句中对 UPDATE 或 DELETE 操作的非目标表进行引用。OUTPUT... DELETED \$1、INSERTED \$1 在同一个查询中不受支持。 | 
| 过程或函数参数限制 | Babelfish 最多支持 100 个过程或函数的参数。 | 
| ROWGUIDCOL | 此子句当前被忽略。引用 `$GUIDGOL` 的查询导致语法错误。 | 
| SEQUENCE 对象支持 | 数据类型 tinyint、smallint、int、bigint、numeric 和 decimal 支持 SEQUENCE 对象。 对于 SEQUENCE 中的数据类型 numeric 和 decimal，Aurora PostgreSQL 支持的精度达到 19 位。 | 
| 服务器级角色 | 支持 `sysadmin` 服务器级角色。不支持 `sysadmin` 以外的其他服务器级角色。 | 
| 除 `db_owner` 以外的数据库级别角色 | 支持 `db_owner` 数据库级角色和用户定义的数据库级角色。不支持 db\$1owner 以外的其他服务器级角色。 | 
| SQL 关键字 SPARSE | 接受并忽略关键字 SPARSE。 | 
| SQL 关键字子句 `ON filegroup` | 此子句当前被忽略。 | 
| 索引和约束的 SQL 关键字 `CLUSTERED` 和 `NONCLUSTERED` | Babelfish 接受并忽略 `CLUSTERED` 和 `NONCLUSTERED` 关键字。 | 
| `sysdatabases.cmptlevel` | `sysdatabases.cmptlevel` 始终设置为 120。 | 
| tempdb 在重启时没有重新初始化 | 重新启动数据库时，不会删除在 tempdb 中创建的永久对象（如表和过程）。 | 
| TEXTIMAGE\$1ON 文件组 | Babelfish 忽略 `TEXTIMAGE_ON` *`filegroup`* 子句。 | 
| 时间精度 | Babelfish 对小数秒支持 6 位数的精度。预计这种行为不会产生负面影响。 | 
| 事务隔离级别 | 以与 READCOMMITTED 相同的方式对待 READUNCOMMITTED。 | 
| 虚拟计算列（非持久性） | 虚拟计算列是作为永久列创建的。 | 
| 无 SCHEMABINDING 子句 | 函数、过程、触发器或视图不支持此子句。已创建对象，但仿佛指定了 WITH SCHEMABINDING。 | 