深爱那片海 发表于 2015-1-16 22:36:08

MSSQL网站制作之自界说公式的盘算处置

从理论上讲,完全可以为数据表里的每个字段分别建一个索引,但MySQL把同一个数据表里的索引总数限制为16个。
原帖地点:
http://community.csdn.net/Expert/topic/3485/3485588.xml?temp=.8813745

--示例数据
createtablesale(datedatetime,codevarchar(10),amtint)
insertsaleselect2004-10-22,aa,15000
unionallselect2004-10-22,bb,18000
unionallselect2004-10-22,cc,20000
unionallselect2004-10-23,aa,21000
unionallselect2004-10-23,bb,18500
unionallselect2004-10-23,cc,19600

createtabledept(codevarchar(10),namevarchar(10))
insertdeptselectaa,西餐厅
unionallselectbb,中餐厅
unionallselectcc,客房部
unionallselectdd,KTV部

createtablecost(datedatetime,codevarchar(10),amtint)
insertcostselect2004-10-22,aa,5000
unionallselect2004-10-22,bb,7000
unionallselect2004-10-22,cc,11000
unionallselect2004-10-23,aa,12000
unionallselect2004-10-23,bb,8500
unionallselect2004-10-23,cc,9600

createtablemeans(codevarchar(10),seqint,varchar(10),formulanvarchar(4000))
insertmeansselectaa,1,发卖支出,^sale@amt^
unionallselectaa,2,发卖本钱,^cost@amt^
unionallselectaa,3,上交利润,(-)*0.3
unionallselectaa,4,净利润,--
go

/*--成绩处置请求形貌

写一个盘算的存储历程,完成依据各基本材料及盘算办法,将数据放到利润明细表中!

如用户输出的查询前提是部门代号aa(@code),日期为:2004-10-22(@date)

则处置历程以下,
1:从利润盘算办法表(means)读取code=aa光临时表
select*into#tempfrommeanswherecode=@codeorderbyseq

2:用游标轮回处置每个项目,按seq从小到年夜的按次,如第一个项目
insertintogain_detail(code,date,desc,amt)
select@code,@date,@desc,sale.amtfromsalewherecode=@codeanddate=@date
别的项目相似

公式申明:
1.^表名@字段名^:比方:^sale@amt^暗示从sale表取amt字段的值,取值前提是code=@codeanddate=@date
2.:比方:--,[]之间为援用本部门后面的盘算了局项,暗示是本部门的发卖支出暗示发卖本钱,别的相似
3.其他的是尺度的盘算表达式
--*/

--成绩处置:
--公式盘算的存储历程
createprocp_calc
@formulanvarchar(4000),--要盘算的公式
@codevarchar(10),--部门代码
@datedatetime,--盘算的日期
@amtintout--盘算的了局
as
declare@s1nvarchar(4000),@s2nvarchar(4000),@iint,@jint

--内部盘算
set@i=patindex(%^%@%^%,@formula)
while@i>0
begin
select@j=charindex(@,@formula,@i)
,@s1=substring(@formula,@i,@j-@i)
,@s2=from
+substring(@formula,@i+1,@j-@i-1)
+wherecode=@codeanddate=@date
,@i=charindex(^,@formula,@j)
,@s1=@s1+substring(@formula,@j,@i-@j+1)
,@s2=select@amt=
+substring(@formula,@j+1,@i-@j-1)
+@s2
execsp_executesql@s2
,N@codevarchar(10),@datedatetime,@amtintout
,@code,@date,@amtout
select@formula=replace(@formula,@s1,@amt)
,@i=patindex(%^%@%^%,@formula)
end

--盘算外部公式
select@i=patindex(%[[]%]%,@formula)
while@i>0
begin
select@j=charindex(],@formula,@i)
,@s1=substring(@formula,@i,@j-@i+1)
,@s2=select@amt=amtfrom#twhereseq=
+substring(@formula,@i+1,@j-@i-1)
execsp_executesql@s2,N@amtintout,@amtout
select@formula=replace(@formula,@s1,@amt)
,@i=patindex(%[[]%]%,@formula)
end

--盘算终极了局
set@s2=select@amt=+@formula
execsp_executesql@s2,N@amtintout,@amtout
go

--盘算利润明细材料的
createprocp_qry
@codevarchar(10),--要盘算的部门代码
@datedatetime--盘算的日期
as
setnocounton
createtable#t(codevarchar(10),datevarchar(10),varchar(10),amtint,seqint)

declare@dtvarchar(10),@descvarchar(10),@amtint,@formulanvarchar(4000),@seqint

set@dt=convert(char(10),@date,120)

declaretbcursorlocalfor
select,formula,seqfrommeans
wherecode=@codeorderbyseq
opentb
fetchtbinto@desc,@formula,@seq
while@@fetch_status=0
begin
--盘算公式
execp_calc@formula,@code,@date,@amtout
insert#tvalues(@code,@dt,@desc,@amt,@seq)
fetchtbinto@desc,@formula,@seq
end
closetb
deallocatetb

select部门代号=code,日期=date,项目内容=,金额=amtfrom#t
go

--挪用
execp_qryaa,2004-10-22
go

--删除测试
droptablesale,dept,cost,means
dropprocp_qry,p_calc
go

/*--测试了局

部门代号日期项目内容金额
-----------------------------------------
aa2004-10-22发卖支出15000
aa2004-10-22发卖本钱5000
aa2004-10-22上交利润3000
aa2004-10-22净利润7000
--*/


用一个库#bak_database存放这些历史数据。

简单生活 发表于 2015-1-19 18:06:21

但是随着数据量的增大,这种成本差距会逐渐减小,趋于相等。(500万数量级只相差10%左右)

谁可相欹 发表于 2015-1-24 22:06:12

其实可以做一下类比,Oracle等数据库产品老早就支持了java编程,而且提供了java池参数作为用户配置接口。但是现在有哪些系统大批使用了java存储过程?!连Oracle自己的应用都不用为什么?!

深爱那片海 发表于 2015-2-2 13:43:41

始终遗憾SQLServer的登陆无法分配CPU/内存占用等指标数。如果你的SQLServer给别人分配了一个只可以读几个表的权限,而这个家伙疯狂的死循环进行连接查询,会给你的系统带来很大的负担。

若天明 发表于 2015-2-7 21:38:46

这一点很好的加强了profiler的功能。但是提到profiler提醒大家注意一点。windows2003要安装sp1补丁才能启动profiler。否则点击没有反应。

山那边是海 发表于 2015-2-23 12:05:04

分区表是个亮点!从分区表也能看出微软要做大作强SQLServer的信心。资料很多,这里不详细说。但是重点了解的是:现在的SQLServer2005的表,都是默认为分区表的。因为它要支持滑动窗口的这个特性。这种特性对历史数据和实时数据的处理是很有帮助的。

冷月葬花魂 发表于 2015-3-7 08:50:42

从项目平台的选择上讲,我们关心的,应该是一款产品能不能满足任务需求,而不是网上怎么说。

兰色精灵 发表于 2015-3-21 12:18:42

不好!如果出了错;不好调试;不好处理!其实web开发将代码分为3层:web层;业务逻辑层和数据访问层;一般对数据库的操作都在数据访问层来做;这样便于调试和维护!而且将来如果是换了数据库的话;你只需要改数据层的代码;其他层的基本可以不变!要是你在jsp中直接调用sql数据库;那么如果换了数据库呢?岂不都要改?如果报了异常呢?怎么做异常处理?
页: [1]
查看完整版本: MSSQL网站制作之自界说公式的盘算处置