SQL 转换应从结构开始,而不是从一份待替换的词语列表开始。
考虑一个连接客户和订单、筛选日期范围、计算收入、按地区分组,并返回总额最高的十条记录的查询。
只更改一个函数名称是不够的。转换后的查询必须保留所有这些部分协同工作的方式。
从源和目标方言开始
相同的 SQL 构造可能需要不同的转换方式,具体取决于它的来源和运行目标。
例如,限制行数可以使用 TOP、LIMIT、FETCH 或其他形式。日期运算、字符串连接、标识符引用和数据类型也各不相同。
结构化转换流程会在应用更改前明确源方言和目标方言。
理解语句结构
SQL 语句包含以下关系:
• 所选表达式
• 源表
• 连接
• 筛选条件
• 分组
• 排序
• 限制
• 嵌套查询
将语句视为一个结构,有助于保持相关更改的一致性。转换可以更新函数,同时保留其位置、参数、别名和周围的表达式。
一致地应用方言规则
当迁移包含大量脚本时,可重复性很重要。
相同的源构造应在整个项目中遵循相同的转换规则。一致的规则有助于审查,并降低相似查询被进行无关重写的可能性。
让行为敏感区域保持可见
有些差异无法仅通过语法安全地解决。
示例包括:
• NULL 处理
• 隐式类型转换
• 数值精度
• 时区行为
• 排序规则和大小写敏感性
• 过程式 SQL
• 动态 SQL
这些区域应被提示出来以供审查。与其默默地假设两个数据库的行为完全相同,不如提供警告更有帮助。
保留意图需要测试
结构化转换能够带来更可靠的初步结果,但只有测试才能确认目标查询保留了所需的行为。
使用有代表性的数据并比较:
• 行数
• 总计和平均值
• 边界日期
• NULL 值
• 重复记录
• 排序顺序
• 错误情况
转换的目标不仅是生成能够运行的 SQL,更是帮助开发者得到行为符合预期的目标 SQL。
Sqlinfy 通过明确的方言选择、结构化转换、易读的输出和诊断信息支持这一流程。人工审查和测试仍然是最终依据。