+ -
当前位置:首页 → 问答吧 → 如果解决SQL变量容量受限下的信息处理问题

如果解决SQL变量容量受限下的信息处理问题

时间:2010-08-15

来源:互联网

如果解决SQL变量容量受限下的信息处理问题
通过replace命令将很大的信息进行转换,如下面的需求

有一个项目,里面很多算法通过存储过程实现,数据使用数据表存储.
随着项目的不断发展,算法和其使用的数据表结构在不断优化,所以存储过程和数据表的结构需要不断更新,
但同时还要保持对以前的兼容性,即一个软件中要包含各个版本的相同算法
当前使用一个数字ID代表算法的版本,举一个计算距离的例子.
create table t_Note_Parameter_1
{
    int latitude not null,
    int longitude not null,
    int distance not null,
    primary key(latitude, longitude)
};

create procedure sp_Compute_Distance_1
{
    update t_Note_parameter_1 set distance = sqrt(latitude*latitude) + sqrt(longitude*longitude)
};

create table t_Note_Parameter_5
{
    int latitude not null,
    int longitude not null,
    int altitude not null,
    int distance not null,
    primary key(latitude, longitude, altitude)
};

create procedure sp_Compute_Distance_5
{
    update t_Note_parameter_5 set distance = sqrt(latitude*latitude) + sqrt(longitude*longitude) + sqrt(altitude*altitude)
};

create table t_Note_Parameter_Template1
{
    int latitude not null,
    int longitude not null,
    int distance not null,
    primary key(latitude, longitude)
};

create procedure sp_Compute_Distance_Template1
{
    update t_Note_parameter_Template1 set distance = sqrt(latitude*latitude) + sqrt(longitude*longitude)
};

create table t_Note_Parameter_Template2
{
    int latitude not null,
    int longitude not null,
    int altitude not null,
    int distance not null,
    primary key(latitude, longitude, altitude)
};

create procedure sp_Compute_Distance_Template2
{
    update t_Note_parameter_Template2 set distance = sqrt(latitude*latitude) + sqrt(longitude*longitude) + sqrt(altitude*altitude)
};

版本1到4的算法和数据结构是相同的,版本5到7的算法和数据结构是相同的
独立维护7个版本的数据表和存储过程是非常麻烦的,每个修改都需要作大量的重复工作,
希望能够采用模板的方式只创建两套算法和数据结构模板,
任何根据不同版本使用的算法模板创建各版本算法对应的数据表和存储过程,如下所示:

create table templatetable
{
    int version not null,
    char(255) tablename not null,
    char(255) templateid not null,
    primary key(version, tablename, teplateid)
};

create table templateprocedure
{
    int version not null,
    char(255) procedurename not null,
    char(255) templateid not null,
    primary key(version, procedurename, teplateid)
};

insert templatetable(1, 't_Note_Parameter_Template1', 'Template1');
insert templatetable(2, 't_Note_Parameter_Template1', 'Template1');
insert templatetable(3, 't_Note_Parameter_Template1', 'Template1');
insert templatetable(4, 't_Note_Parameter_Template1', 'Template1');
insert templatetable(5, 't_Note_Parameter_Template2', 'Template2');
insert templatetable(6, 't_Note_Parameter_Template2', 'Template2');
insert templatetable(7, 't_Note_Parameter_Template2', 'Template2');

insert templateprocedure(1, 'sp_Compute_Distance_Template1', 'Template1');
insert templateprocedure(2, 'sp_Compute_Distance_Template1', 'Template1');
insert templateprocedure(3, 'sp_Compute_Distance_Template1', 'Template1');
insert templateprocedure(4, 'sp_Compute_Distance_Template1', 'Template1');
insert templateprocedure(5, 'sp_Compute_Distance_Template2', 'Template1');
insert templateprocedure(6, 'sp_Compute_Distance_Template2', 'Template1');
insert templateprocedure(7, 'sp_Compute_Distance_Template2', 'Template1');

现在通过replace命令可以将各模板的数据表和存储过程转换为各版本的数据表和存储过程,但是由于replace
所使用的变量最大只能有8000字符,而复杂的存储过程是大于8000的. 后来计划将模板的SP信息导入到一张txt表中
将表中的每一行数据进行转换,但又担心替换变量如'Template1'在两行之间切断,导致无法正确转换,
请问是否有好的方法能够实现将一个存储过程的中的某些固定字符进行替换,从而生成新的存储过程.
或是能够将存储过程信息在导入到txt表中时能够根据自动根据换行符,只将一行信息导入一个数据块中,这样能够保证替换变量的完整性.

作者: macroiori   发布时间: 2010-08-15

楼主构思很新颖,不过没看懂楼主最后的意图

作者: dingning239   发布时间: 2010-08-16

所有的语言应该都会受变量存储的限制。没办法吧。

作者: renxiao2003   发布时间: 2010-08-16

我的意图其实就是将功能类似的存储过程的实现收编在存储过程模板中,数据表templateprocedure起到配置文件的作用,存储不同版本(ID)下相同存储过程名由哪个存储过程模板创建,这样算法实现的维护只要在存储过程模板的维护就可以了。
在“编译”前完成所有需要支持版本的数据表和存储过程的创建,我希望是在内存中使用replace完成,但是由于变量的容量限制,看样子只能通过导出到文件中,使用C++再处理一把,这样效率比较差,而且这个方案看起来不够完整,我在SQL上是完全的菜鸟,实在想不出更好的方法了。

作者: macroiori   发布时间: 2010-08-16