ERWin 7导出注释到SQLServer 2005
当初选择放弃PowerDesigner,是因为它过于庞大复杂,对于只想建立数据库逻辑与物理模型、生成数据字典的需求,用PD是大材小用,而且也未必顺手,因此转而投奔ERWin 7。
开始都还顺利!但是在进行正向工厂,生成数据库时,发现无法将注释导出到SQLServer2005中——网上有关资料说在ERWin 4.X版本中就已经实现了这个功能,难道高级版本反而却不能了?如果无法实现将注释导入数据库,那应用ERWin 7的效益就大打折扣了!
一次偶然机会发现注释可以导出到Oracle中,那么可否将导出的Oracle中的SQL语句注释转换为SQLServer2005中的注释?
说干就干!首先看一下ERWin 7导出的SQLServer、Oracle中SQL语句的区别。
(1)带注释的Oracle SQL语句
CREATE TABLE T_BBS
(
BBSID INTEGER NOT NULL ,
);
COMMENT ON TABLE T_BBS IS '论坛信息表';
COMMENT ON COLUMN T_BBS.BBSID IS '帖子ID';
…………
(2)不带注释的SQLServer SQL语句
CREATE TABLE T_BBS
(
BBSID int IDENTITY (1,1) ,
)
…………
(3)带注释的SQLServer SQL语句
CREATE TABLE T_BBS
(
BBSID int IDENTITY (1,1) ,
)
go
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'论坛信息表' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'T_BBS'
go
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'帖子ID' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'T_BBS' ,@level2type=N'COLUMN', @level2name=N'BBSID'
go
…………
因此,我们需要做的就是利用(1)将(2)转换为(3)——二转换的本质就是首先读取导出的sql语句(1)(2),然后生成新的sql语句(3)。由于手上正好有MatlAB软件,而且以前又做过类似的文件读取操作,于是就开始拿来主义啦J
直接上代码:
% 指定输入文件
file_Oracle = 'Oracle_Sql(带注释).txt';
file_SQL = 'SQLServer_Sql(不带注释).txt';
% 指定输出文件
file_output = 'D:\SQLServer_Sql(带注释).txt';
fi_Oracle = fopen(file_Oracle, 'rt');
fi_SQL = fopen(file_SQL, 'rt');
fi_output = fopen(file_output,'w');
% 指定特征字符串
preOracle_str_1 = 'COMMENT ON TABLE';
preOracle_str_2 = 'COMMENT ON COLUMN';
% 对于输入单引号'的情形,以两个单引号''来实现
preSQL_str_1 = 'EXEC sys.sp_addextendedproperty @name=N''MS_Description'', @value=N''';
preSQL_str_2 = '@level0type=N''SCHEMA'', @level0name=N''dbo'', @level1type=N''TABLE'', @level1name=N''';
preSQL_str_3 = '@level2type=N''COLUMN'', @level2name=N''';
i_Oracle = 0; %当前所在Oracle记录行数
i_SQL = 0; %当前所在SQLServer记录行数
while ( ~feof(fi_Oracle) )
str = fgetl( fi_Oracle );
idx_TABLE = strfind(str,preOracle_str_1);
idx_COLUMN = strfind(str,preOracle_str_2);
idx = [idx_TABLE idx_COLUMN];
if isempty(idx)
continue;
else
if ~isempty(idx_TABLE)
%%%%%%%%%%%%%%%%%%%%%%%%%%%若是数据表的注释
% 将str中的数据表名、数据表注释取出并保存
idx_temp = strfind(str,'''');
str_Oracle.Table = str(length(preOracle_str_1)+2:idx_temp(1)-5);
str_Oracle.Comment = str(idx_temp(1)+1:idx_temp(2)-1);
% 定位SQLServer相关行
while ( ~feof(fi_SQL) )
str = fgetl( fi_SQL );
idx_INDEX = strfind(str,'ALTER TABLE');
if ~isempty(idx_INDEX)
%将本行及后面5行写入文件
str = [str];
fprintf(fi_output,'%s\n',str);
while ( ~feof(fi_SQL) )
str = fgetl( fi_SQL );
fprintf(fi_output,'%s\n',str);
if ~isempty(strfind(str,'go'))
% 首先加入一回车行,然后写入来自Oracle的Comment
fprintf(fi_output,'\n');
%将组合后数据写入文件
str_combine = [preSQL_str_1 str_Oracle.Comment ''' ,' preSQL_str_2 str_Oracle.Table ''''];
fprintf(fi_output,'%s\n',str_combine);
fprintf(fi_output,'go\n');
break;
end
end
break;
else
%将本行写入文件
fprintf(fi_output,'%s\n',str);
end
end
else
if ~isempty(idx_COLUMN)
%%%%%%%%%%%%%%%%%%%%%%%%%%%若是数据字段的注释
% 将str中的数据字段名、注释取出并保存
idx_temp = [strfind(str,'.') strfind(str,'''')];
str_Oracle.COLUMN = str(idx_temp(1)+1:idx_temp(2)-5);
str_Oracle.Comment = str(idx_temp(2)+1:idx_temp(3)-1);
% 定位SQLServer相关行
% 首先加入一回车行,然后写入来自Oracle的Comment
fprintf(fi_output,'\n');
%将组合后数据写入文件
str_combine = [preSQL_str_1 str_Oracle.Comment ''' ,' preSQL_str_2 str_Oracle.Table ''' ,' preSQL_str_3 str_Oracle.COLUMN ''''];
fprintf(fi_output,'%s\n',str_combine);
fprintf(fi_output,'go\n');
end
end
end
end
fclose(fi_Oracle);
fclose(fi_SQL);
fclose(fi_output);
OK,至此问题解决!虽说有些麻烦,甚或有些不值,但毕竟是解决问题了!
后记:在使用ERWin 7的过程中也发现还有两个小小不足:
(1)逻辑模型(Logical Model)与物理模型(Physical Model)字段顺序的不同步
比如你调整了逻辑模型中表的字段顺序,但在对应的物理模型中则没有变化。
(2)逻辑模型与物理模型的字段类型不一致
虽说最终生成的数据库字段类型取决于物理模型的数据类型,但还是挺让人感觉有点不爽。
欢迎大家通过邮件(huangliang622@163.com)或QQ(82342563)与我交流!

浙公网安备 33010602011771号