您的位置:首页 > 数据库

SQL SERVER2008到DB2 V9.7的数据迁移

2013-11-12 18:03 375 查看
用powerdesigner生成DB2脚本



不生成 Foreign key 和Index



生成结果:



注意的地方,如果是从SQL Server2008生成的脚本
表脚本修改:
1,双引号(“)替换为空字符串
2,NUMERIC类型替换为  DECIMAL
3,image 类型替换为   BLOB(10M)
4,datetime 类型替换为 TIMESTAMP
5,自增长数据类型NUMERIC ,DECIMAL  改为BIGINT或INTEGER
语法如:ConfigCode INTEGER  not null  generated always as identity (start with 1 increment by 1),
如果要导出数据时必须忽略自增长数据列。
 
视图脚本修改:
1,需要加上set current schema dbo;
2 ,DB2的视图里不能直接用order by语句,必须这样写:
select × from(select a,b,c from table1 order by a)as tab
3,凑字段时,用’ ‘as name,不用’’as name
4,to_char(OPERATIONTIME, 'yyyy-mm') AS EXPR1,  替换CONVERT(varchar(7), OperationTime, 120) AS Expr1
5,ISNULL  替换为VALUE
 
其他事项:
数据库权限要至少给DB2ADMIN用户加上DBADM权限



表脚本执行结果




用SQL Server的数据导出工具导出数据到DB2数据库



选择源数据库



选择目标数据库,用OLE DB Provider



选择ODBC中创建好的DB2数据源



选择复制表或视图数据



选择目标表,做好映射,用下拉选择。



编辑映射按钮弹出列映射窗口,检查选中向目标表中追加行,和映射的数据类型和大小、精度。



开始导入



导入成功。



 
 
存储过程脚本修改:(语句终止字符由;改为@才能执行,很土)
DROP PROCEDURE DBO.SP_VIEWPAGE
@
CREATE PROCEDURE DBO.SP_VIEWPAGE
(
IN ITBNAME VARCHAR(2000),-- 表名
IN ISHOWFIELD VARCHAR(1000),-- 显示字段
IN IJOIN VARCHAR(1000),-- 联接条件(如:内联、外联)
IN IWHERE VARCHAR(2000),-- 查询条件 (注意: 不要加 WHERE)
IN IORDER VARCHAR(100),-- 排序条件 (注意: 不要加 ORDER BY)
IN IPAGESIZE INTEGER,-- 页尺寸 如果为0 默认返回前一百万条数据可以认为是返回所有数据
INOUT IOCURRENTPAGEIX INTEGER,-- 输入和输出:当前页
OUT OPAGESTARTROW INTEGER,-- 输出:当前开始行
OUT OPAGEENDROW INTEGER,-- 输出:当前结束行
OUT OTOTALROWS INTEGER,-- 输出:当前总记录数
OUT OHASPREVIOUSPAGE INTEGER,-- 输出:是否有上一页
OUT OHASNEXTPAGE INTEGER,-- 输出:是否有下一页
OUT OTOTALPAGES INTEGER,-- 输出:总页数
OUT OERROR VARCHAR(1000)-- 输出:错误信息
)
RESULT SETS 1
MODIFIES SQL DATA
NOT DETERMINISTIC
LANGUAGE SQL
BEGIN
-- =============================================
-- AUTHOR:        <xxx>
-- CREATE DATE: <2013-11-14>
-- DESCRIPTION:    存储过程分页
-- 使用实例:CALL DBO.SP_VIEWPAGE('DBO.USERINFO AS A','A.*','','B.AGE>30','B.AGE',10,1,?,?,?,?,?,?,?);
-- =============================================
DECLARE STRSQL   VARCHAR(6000);-- 主语句
DECLARE RESULT CURSOR WITH RETURN TO CALLER FOR S2;
DECLARE EXIT HANDLER FOR SQLEXCEPTION-- 异常捕获
BEGIN
SET OERROR = 'ERROR!'||STRSQL;
END;
-- BODY START --
IF(IWHERE <> '') THEN
SET IWHERE = ' WHERE ' || IWHERE;
END IF;
IF(IORDER <> '') THEN
SET IORDER = 'ORDER BY ' || IORDER;
END IF;
IF(IJOIN <> '') THEN
SET IJOIN = ' ' || IJOIN;
END IF;
SET STRSQL = 'SELECT COUNT(*) FROM ' || ITBNAME || IJOIN || IWHERE;
PREPARE S2 FROM STRSQL;
OPEN RESULT;
FETCH RESULT INTO OTOTALROWS;-- 总记录数
CLOSE RESULT;
IF(IPAGESIZE = 0) THEN
SET IPAGESIZE = 1000000;-- 每页显示数
END IF;
SET OTOTALPAGES = (OTOTALROWS - 1) / IPAGESIZE + 1;-- 总页数
IF(IOCURRENTPAGEIX < 1) THEN
SET IOCURRENTPAGEIX = 1;-- 当前页
ELSE
IF(IOCURRENTPAGEIX > OTOTALPAGES) THEN
SET IOCURRENTPAGEIX = OTOTALPAGES;
END IF;
END IF;
SET OPAGESTARTROW = IPAGESIZE * (IOCURRENTPAGEIX -1) + 1;-- 每页开始数
IF(IOCURRENTPAGEIX = OTOTALPAGES) THEN
SET OPAGEENDROW = OTOTALROWS;-- 每页结束数
ELSE
SET OPAGEENDROW = IPAGESIZE * IOCURRENTPAGEIX;
END IF;
IF(IOCURRENTPAGEIX > 1) THEN
SET OHASPREVIOUSPAGE = 1;-- 是否有上一页
ELSE
SET OHASPREVIOUSPAGE = 0;
END IF;
IF(IOCURRENTPAGEIX < OTOTALPAGES) THEN
SET OHASNEXTPAGE = 1;-- 是否有下一页
ELSE
SET OHASNEXTPAGE = 0;
END IF;
SET STRSQL = 'SELECT * FROM (SELECT ROWNUMBER() OVER(' || IORDER || ') AS ROWNUM,'
|| ISHOWFIELD
|| ' FROM '
|| ITBNAME
|| IJOIN
|| IWHERE
|| ') AS TEMP WHERE ROWNUM BETWEEN ' || RTRIM(CHAR(OPAGESTARTROW)) || ' AND '
|| RTRIM(CHAR(OPAGEENDROW));
PREPARE S2 FROM STRSQL;
OPEN RESULT;
-- BODY END --
END
@
 
执行结果:


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: