关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » SQL Server »实例讲解Oracle到SQL Server主键迁移

    实例讲解Oracle到SQL Server主键迁移

    2015-11-21 00:00:00 出处:ITJS
    分享

    该文主要介绍了Oracle数据库到SQL Server数据库主键的迁移过程,具体内容请参考下文。

    由于项目需要要将以前Oracle的数据库转化为SQL Server,今天利用SQL Server的DTD进行数据库的迁移,但导入以后发现只导入了表结构和数据,而表的一些主键约束都没导过来,感觉很郁闷,而手头又没有好的迁移工具,如Erwin,所以动手写了个小工具,基本实现了主键的转移,主要代码如下:

    主要控件:

    ADOConnOrcale: TADOConnection; //连接Oracle

    连接Oracle:

    连接SQL Server:

    ADOConnSQLServer.ConnectionString :=Format(SQLConnStr,[trim(EdtServer.Text),

    主要执行代码,比较乱,没有整理,不过实现功能就行了。

    procedure TForm1.Button1Click(Sender: TObject);
    var
    i:Integer;
    FieldN, tableN, fieldM,aa:String;
    begin
    if Not ADOConnOrcale.Connected then
    begin
    MsgBox('请先连接Oracle数据库!');
    exit;
    end;
    if not ADOConnSQLServer.Connected then
    begin
    MsgBox('请先连接SQL Server数据库!');
    exit;
    end;
    Screen.Cursor :=crHourGlass;
    try
    o1.Close;
    O1.SQL.Clear;
    //取oracle表用户budget的所有主键约束信息
    o1.SQL.Text :=' select a.CONSTRAINT_NAME,a.CONSTRAINT_TYPE,a.TABLE_NAME, b.COLUMN_NAME,

    b.position '+
    ' from USER_CONSTRAINTS a,USER_CONS_COLUMNS b where a.CONSTRAINT_NAME=b.CONSTRAINT_NAME '+
    ' and a.table_name=b.table_name and constraint_type=''P'' and a.owner=b.owner '+
    ' and lower(a.owner)=''budget'' order by a.table_name,b.position ';
    O1.open;
    tableN:='';
    O1.First;
    ProgressBar1.Max:=O1.RecordCount;
    ProgressBar1.Min:=0;
    ProgressBar1.Step:=1;
    ProgressBar1.Visible :=true;
    for i:=0 to O1.RecordCount -1 do
    begin
    s2.Close;
    S2.SQL.Clear;
    //判断SQL Server表是否存在当前的字段信息
    S2.SQL.Text:='SELECT a.name AS tanme, b.* FROM sysobjects a INNER JOIN '+
    ' syscolumns b ON a.id = b.id '+
    ' WHERE (a.xtype = ''U'') AND (a.name = '''+O1.fieldbyname('table_name')

    .AsString+''''+
    ') and b.name= '''+O1.fieldbyname('COLUMN_NAME').AsString+''''+
    ' ORDER BY b.id';
    S2.Open;
    //不存在,输出表明和字段名
    if s2.RecordCount<=0 then
    begin
    Memo1.Text:=Memo1.Text+#13+'表:'''+O1.fieldbyname('table_name').AsString+''''+
    ' 字段:'''+O1.fieldbyname('COLUMN_NAME').AsString+''' 不存在!';
    O1.Next;
    tableN:='';
    FieldN:='';
    Continue;
    end;
    //是当前表,循环读取主键信息
    if (tableN='') or (tableN= O1.fieldbyname('table_name').AsString) then
    begin
    FieldN:=FieldN+'['+O1.fieldbyname('COLUMN_NAME').AsString+'],';//表明相同或初试时
    tableN:= O1.fieldbyname('table_name').AsString;
    end
    else
    begin
    with S1 do
    begin
    try
    //取SQL Server表的主键信息
    Close;
    sql.Clear;
    sql.Text:='SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME=

    '''+tableN+'''';
    Open;
    first;
    aa:=fieldbyname('constraint_name').AsString;
    //假如该主键在SQL表中已存在,删除该主键信息,重建该表主键
    if recordcount>0 then
    begin
    sql.Clear;
    SQL.Text:='ALTER TABLE '+tableN+' DROP CONSTRAINT '+aa; //删除主键
    ExecSQL;
    end;
    SQL.Clear; //COLUMN_NAME
    SQL.Text:='ALTER TABLE '+tableN+' WITH NOCHECK ADD '+
    ' CONSTRAINT [PK_'+tableN+'] PRIMARY KEY NONCLUSTERED '+
    ' ( '+ copy(FieldN,1,length(FieldN)-1)+
    ' )';
    ExecSQL;
    FieldN:='['+O1.fieldbyname('COLUMN_NAME').AsString+'],';
    tableN:= O1.fieldbyname('table_name').AsString;
    Except
    Memo1.Text :=Memo1.Text+'表: '+tableN+' 字段: '+FieldN+' 导入出错!';
    exit;
    end;
    end;
    end;
    ProgressBar1.StepIt;
    Application.ProcessMessages;
    O1.Next;
    end;
    MsgBox('导入完成!');
    finally
    Screen.Cursor :=crDefault;
    ProgressBar1.Visible :=False;
    end;
    end;

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    hiberfil.sys文件可以删除吗?了解该文件并手把手教你删除C盘的hiberfil.sys文件

    Window 10和 Windows 11哪个好?答案是:看你自己的需求

    盗版软件成公司里的“隐形炸弹”?老板们的“法务噩梦” 有救了!

    帝国CMS7.5编辑器上传图片取消宽高的三种方法

    帝国cms如何自动生成缩略图的实现方法

    Windows 12即将到来,将彻底改变人机交互

    帝国CMS 7.5忘记登陆账号密码怎么办?可以phpmyadmin中重置管理员密码

    帝国CMS 7.5 后台编辑器换行,修改回车键br换行为p标签

    Windows 11 版本与 Windows 10比较,新功能一览

    Windows 11激活产品密钥收集及专业版激活方法

    IT头条

    智能手机市场风云:iPhone领跑销量榜,华为缺席引争议

    15:43

    大数据算法和“老师傅”经验叠加 智慧化收储粮食尽显“科技范”

    15:17

    严重缩水!NVIDIA将推中国特供RTX 5090 DD:只剩24GB显存

    00:17

    无线路由大厂 TP-Link突然大裁员:补偿N+3

    02:39

    Meta 千万美金招募AI高级人才

    00:22

    技术热点

    微软已修复windows 7/windows 8.1媒体中心严重漏洞 用户可下载安

    卸载MySQL数据库,用rpm如何实现

    windows 7中使用网上银行或支付宝支付时总是打不开支付页面

    一致性哈希算法原理设计

    MySQL数字类型中的三种常用种类

    如何解决SQL Server中传入select语句in范围参数

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。