MSSQL网页设计怎样完成100%的静态数据管道(三)
用一个库#bak_database存放这些历史数据。静态|数据上面看看,怎样依据两头层的数据,构建管道语法:
1.起首创建一个数据窗口工具:d_vdtcolumns
SQL语法是:
SELECTvdt_columns.utid,
vdt_columns.uid,
vdt_columns.upkey,
vdt_columns.udmid,
vdt_columns.udmname,
vdt_columns.unulls,
vdt_columns.uwidth,
vdt_columns.uscale,
vdt_columns.uname,
vdt_columns.udefault,
vdt_columns.ucheck,
vdt_columns.utname,
vdt_columns.uidentity
FROMvdt_columns
WHEREutname=:as_tname
2.筹办事情停当,上面就是主疆场了,入手下手构建数据管道.
思索到一个管道工具能够传输多个义务,创建一个工具nvo_pipetransattrib保留传输必要的语法:
它包括了一下的instance变量:
stringis_objectname//表名
stringis_syntax//管道语法
stringis_sconnect=zw,is_dconnect=daixf//源数据库毗连和目标数据库毗连
stringis_ptype,is_pcommit,is_errors//管道的几个属性
stringis_sname,is_dname//源表名,目标表名
stringis_sqlsyntax//管道的SQL语法
创建一个工具,从数据管道工具承继.
入手下手机关语法:写一个函数.
nvo_pipetransattribinv_attrib[]
stringls_syntax,ls_sourcesyntax,ls_destsyntax
intli,lj,li_ind,li_find,li_rows,li_identity
stringls_tablename,ls_default,ls_defaultvalue,ls_pbdttype
booleanlb_find
decld_uwidth,ld_prec,ld_uscale
stringls_types,ls_dbtype,ls_prikey,ls_name,ls_nulls,ls_msg,ls_title=of_constrpipesyntax()
nvo_stringlnv_string
nvo_datastorelds_vdtcolumns
booleanlb_key
lds_vdtcolumns=createnvo_datastore
lds_vdtcolumns.dataobject=d_vdtcolumns
lds_vdtcolumns.settransobject(SrcSqlca)
li=1
of_input(inv_attrib)
li_find=pos(inv_attrib.is_sqlsyntax,*,1)
ifli_find>0then
lds_vdtcolumns.retrieve(as_tablename)
of_filterimg(lds_vdtcolumns)
li_rows=lds_vdtcolumns.rowcount()
forlj=1toli_rows
ls_name=lds_vdtcolumns.getitemstring(lj,uname)
ls_types=lds_vdtcolumns.getitemstring(lj,udmname)
li_identity=lds_vdtcolumns.getitemnumber(lj,uidentity)
ls_types=of_getpipedbtype(is_s_dbtype,ls_types)
ls_pbdttype=of_getpbdttype(is_s_dbtype,ls_types)
choosecasels_types
casechar,varchar,nchar,nvarchar,longvarchar
ifls_types=longvarcharthenls_types=varchar
ld_uwidth=lds_vdtcolumns.getitemnumber(lj,uwidth)
ls_dbtype=ls_types+(+string(int(ld_uwidth))+)
casedecimal,numeric
ld_uwidth=lds_vdtcolumns.getitemnumber(lj,uwidth)
ld_uscale=lds_vdtcolumns.getitemnumber(lj,uscale)
ifli_identity=1then
ls_dbtype=identity+(+string(int(ld_uwidth))+,+string(int(ld_uscale))+)
else
ls_dbtype=ls_types+(+string(int(ld_uwidth))+,+string(int(ld_uscale))+)
endif
caseelse
ls_dbtype=ls_types
endchoose
ls_prikey=lds_vdtcolumns.getitemstring(lj,upkey)
ifls_prikey=Ythen
lb_key=true
ls_prikey=key=yes,
else
ls_prikey=
endif
ls_nulls=lds_vdtcolumns.getitemstring(lj,unulls)
ifls_nulls=Ythen
ls_nulls=yes
else
ls_nulls=no
endif
ls_default=isnull(lds_vdtcolumns.getitemstring(lj,udefault),)
ls_sourcesyntax+="COLUMN(type="+ls_pbdttype+",name=~""+ls_name+"~",dbtype=~""+ls_dbtype+"~","+ls_prikey+"nulls_allowed="+ls_nulls+")~r~n"
ifls_default=then
ifli_identity=1then
ls_destsyntax+="COLUMN(type="+ls_pbdttype+",name=~""+ls_name+"~",dbtype=~""+ls_dbtype+"~","+ls_prikey+"nulls_allowed="+ls_nulls+",initial_value=~"exclude~")~r~n"
else
ls_destsyntax+="COLUMN(type="+ls_pbdttype+",name=~""+ls_name+"~",dbtype=~""+ls_dbtype+"~","+ls_prikey+"nulls_allowed="+ls_nulls+")~r~n"
endif
else
ifli_identity=1then
ls_destsyntax+="COLUMN(type="+ls_pbdttype+",name=~""+ls_name+"~",dbtype=~""+ls_dbtype+"~","+ls_prikey+"nulls_allowed="+ls_nulls+",default_value=~""+ls_default+"~",initial_value=~"exclude~")~r~n"
else
ls_destsyntax+="COLUMN(type="+ls_pbdttype+",name=~""+ls_name+"~",dbtype=~""+ls_dbtype+"~","+ls_prikey+"nulls_allowed="+ls_nulls+",default_value=~""+ls_default+"~")~r~n"
endif
endif
next
else
return
endif
ls_sourcesyntax+=)
ls_destsyntax+=)
//generatePIPELINE
//example:
//PIPELINE(source_connect=csfdata,destination_connect=csfdata,type=replace,commit=100,errors=100,keyname="Bar_x")
iflb_keythen
ls_syntax+=PIPELINE(source_connect=+inv_attrib.is_sconnect+,destination_connect=+inv_attrib.is_dconnect+,type=+inv_attrib.is_ptype+,commit=+inv_attrib.is_pcommit+,errors=+inv_attrib.is_errors+,keyname="+as_tablename+_x")~r~n
else
ls_syntax+=PIPELINE(source_connect=+inv_attrib.is_sconnect+,destination_connect=+inv_attrib.is_dconnect+,type=+inv_attrib.is_ptype+,commit=+inv_attrib.is_pcommit+,errors=+inv_attrib.is_errors+)~r~n
endif
//generateSOURCE
//example:
//SOURCE(name="Bar",COLUMN(type=char,name="CustomCode",dbtype="char(8)",key=yes,nulls_allowed=no)
ls_syntax+=SOURCE(name="+inv_attrib.is_sname+",
ls_syntax+=ls_sourcesyntax
//generateRETRIEVE
//example:
//RETRIEVE(statement="SELECTBar.CustomCode,Bar.BarCode,Bar.ItemCode,Bar.Metering,Bar.PackSize,Bar.Length,Bar.Width,Bar.High,Bar.Vol,Bar.Weight,Bar.NewPackFlagFROMBar")
ls_syntax+=RETRIEVE(statement="+inv_attrib.is_sqlsyntax+")
//generateDESTINATION
//example:
//DESTINATION(name="Bar_copy",
//COLUMN(type=char,name="CustomCode",dbtype="char(8)",key=yes,nulls_allowed=no,initial_value="spaces")
ls_syntax+=DESTINATION(name="+inv_attrib.is_dname+",
ls_syntax+=ls_destsyntax
returnls_syntax
这个函数的前往值就是构建完成的管道语法了.
个中:初始化的函数:of_input(inv_attrib)
是初始化,inv_attrib的函数,初始化的数据次要是用户必要输出的前提,好比管道的type,commit,errors,select语句.
必要申明一下,个中处置了几个特别的情形的函数.
of_filterimg(lds_vdtcolumns):
过滤失落表中的image列,由于管道不撑持image数据传输.
of_getpipedbtype(is_s_dbtype,ls_types):
依据表中列的范例失掉管道中数据列的范例,由于他们不是老是逐一对应的.
这个能够经由过程一个extenddatawindowobject,并包括有初始数据来完成.
of_getpbdttype(is_s_dbtype,ls_types):
依据表中列的范例失掉管道中列的范例,由于他们也不是老是逐一对应的.
这个能够经由过程一个extenddatawindowobject,并包括有初始数据来完成.
管道语法构建完成了,就能够实行管道传输了:
this.syntax=失掉的语法
li_RC=this.Start(SrcSqlca,DestSqlca,idw_Errors)
Ifli_RC1Then
ifnotib_silencethenmsg(ls_title,"工具传输失利:"+string(li_rc))
of_addtransmsg(工具<+is_currentobj+>传输失利:+string(li_rc))
returnli_RC
rollback;
else
Commit;
Endif
提供多语言支持,常见的编码如中文的GB2312、BIG5,日文的Shift_JIS等都可以用作数据表名和数据列名。 having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。 这是一个不错的新特性。虽然索引的附加字段没有索引键值效率高,但是相对映射到数据表中效率还是提高了很多。我做过试验,在我的实验环境中会比映射到表中提高30%左右的效率。 理解了存储结构,再阅读下性能优化的章节基本上会对sqlserver有个清晰地认识 而SQLServer如果能像Oracle一样可以为登陆分配如:5%的cpu,10%的内存。就可以解决这个漏洞。 一直以来个人感觉SQLServer的优化器要比Oracle的聪明。SQL2005的更是比2k聪明了不少。(有次作试验发现有的语句在200万级时还比50万级的相同语句要快show_text的一些提示没有找到解释。一直在奇怪。) having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。 对递归类的树遍历很有帮助。个人感觉这个真是太棒了!阅读清晰,非常有时代感。 其中最有名的应该是row_number了。这个终于解决了用临时表生成序列号的历史,而且SQLServer2005的row_number比Oracle的更先进。因为它把Orderby集成到了一起,不用像Oracle那样还要用子查询进行封装。
页:
[1]