用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
@
执行结果: