用途:帮助编写在 Azure SQL Database 上返回正确结果的 T-SQL,并找出“语句成功但答案错误”的静默失败,以及从 PostgreSQL 迁移时的习惯性写法问题。
主要能力:
- 空值安全:指出 = NULL、<> NULL 恒为 UNKNOWN,NOT IN 子查询含 NULL 会返回空集,建议改用 NOT EXISTS 或 IS NOT DISTINCT FROM。
- 聚合与类型:SUM/AVG/COUNT 会跳过 NULL,AVG 分母可能不是总行数;整数除法截断;ISNULL 按其第一参数类型转换并截断,COALESCE 取最高优先级类型。无长度的字符串变量截断为 1 字符,cast 中为 30。
- 会话设置:QUOTED_IDENTIFIER 在解析时决定语义,容器内 sqlcmd 默认 OFF,应用连接默认 ON,可用 -I 统一。
- PostgreSQL 迁移对照:LIMIT/OFFSET、RETURNING、SERIAL、布尔值、ILIKE、TEXT、ON CONFLICT 等对应 T-SQL 写法;USE 在 Azure SQL 不受支持,需新开连接。
- 新特性:||、UNISTR、正则函数、STRING_AGG、TRIM 定位关键字、GREATEST/LEAST 等在较新兼容级别可用,需先确认数据库兼容级别。
使用方式:把检查脚本保存为 check-correctness.sql,查询 @@OPTIONS 确认会话设置,查询 sys.columns 找出未指定长度的字符串列;用 sqlcmd -S <server>.database.windows.net,1433 -d <database> -U <user> -C -I -b -m-1 -i check-correctness.sql -o check-correctness.out 执行。
限制:不涉及列长度、排序规则或索引设计;不扩展为错误处理或触发器设计;部分特性依赖兼容级别与 sqlcmd 版本,资料未提供更多环境细节。