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)与我交流!

posted @ 2012-03-16 18:06  月影飞鸿  阅读(1454)  评论(2)    收藏  举报