日期:2014-05-17  浏览次数:20394 次

紧急求助,有没有将SQL Server的SQL翻译为Oracle的第三方组件?
最近接到一个项目,不是很大,但客户要求数据库用oracle,而我们的系统是在sql server下做的,我们的系统在程序中嵌入了大量的SQL语句,如果全部手动翻译几乎是不可能的,我们的系统基于delphi的midas三层架构,幸好系统设计时将所有的SQL(包括客户端和中间层)都是通过中间层一个统一的接口来执行的,我想,如果在这个接口中将需要执行的SQL进行语法转换,就可以直接支持oracle了,但这种转换也算是一种高技术含量的活,想请教一下各位见多识广的大虾,有没有现成的第三方组件可以完成这个工作?例如,我传一个SQL Server规范的SQL给组件,组件返回一个支持Oracle规范的SQL给我就行了。感谢~!
------最佳解决方案--------------------
异想天开.
------其他解决方案--------------------
首先你的SQL语句是用SQL99的规范写的吗?
如果你的SQLSERVER上面不运行SP,只是直接SQL语句写的话,那你比较幸运,ORACLE和SQLSERVER在SQL语句上面的差异主要在函数上,比如日期函数之类的。这样改起来比较简单。
如果你在SQLSERVER上布置了大量的SP,那你只能慢慢改了,ORACLE和SQLSERVER的SP还是区别很大的。

------其他解决方案--------------------
找到以后给我传一个 谢谢
------其他解决方案--------------------
这个不大现实,有些东西还是得手工做一下。。。。。

------其他解决方案--------------------
可以去oracle版块问问,或者直接咨询oracle的技术支持。。。
------其他解决方案--------------------
呵,若是SP,改动反而更容易。。。。若是在客户端,那就只有到处搜索喽

------其他解决方案--------------------
引用:
异想天开.


我觉得并非异想天开,事实上我已经找到这个工具(sqlways),里面有提供这样的功能,但可惜不是组件。
------其他解决方案--------------------
引用:
首先你的SQL语句是用SQL99的规范写的吗?
如果你的SQLSERVER上面不运行SP,只是直接SQL语句写的话,那你比较幸运,ORACLE和SQLSERVER在SQL语句上面的差异主要在函数上,比如日期函数之类的。这样改起来比较简单。
如果你在SQLSERVER上布置了大量的SP,那你只能慢慢改了,ORACLE和SQLSERVER的SP还是区别很大的。


SP很少
------其他解决方案--------------------
引用:
呵,若是SP,改动反而更容易。。。。若是在客户端,那就只有到处搜索喽


所有SQL的执行,都是通过AppServer里一个的函数来完成的,也许不需要这样做~
------其他解决方案--------------------
挺麻烦的。
------其他解决方案--------------------
花了两天时间,基本上搞定(还有待完善,但最核心的已经可以,包括函数提取和替换算法已经搞定):

unit SqlConvertToOracle;

interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

Type

   TSqlFuncInfo = record
     Name: string;
     ArgCount: integer;
     Args: array [0..10] of string[100];
   end;

//最终需要调用的函数
function ConvertSQLToOracle(ASQL: string): string;

//从SQL中提取函数信息
function GetFirstFuncInfo(ASQL, AFuncName: string; var ABegin, AEnd: integer; var AFunInfo: TSqlFuncInfo): boolean;

//将原来的函数替换成新的函数(包括参数)
function ReplaceFunctionByNew(ASQL: string; ABegin, AEnd: integer; AFuncInf, ANewFuncInf: TSqlFuncInfo): string;

//转换SQl Server中以 = 表示的列别名,例如: Abc = Field1 转换为 Field1 Abc
function ConvertFieldAlias(ASQL: string): string;

implementation

function ReplaceCommons(ASQL: string): string;
begin
  Result := StringReplace(ASQL, ' #', ' T_', [rfReplaceAll]);  //临时表的名称
  Result := StringReplace(Result, ' as ', ' ', [rfReplaceAll]); //别名去掉as