仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 895|回复: 7
打印 上一主题 下一主题

[学习教程] MSSQL网页设计主键天生器

[复制链接]
老尸 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:36:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
因此我们的方案中要构造这种逆操作。Event_type增加一种FlashBACK_EVENT。这类操作形式与Query_Event相同,都是简单的SQL语句,只是包含了将数据恢复的操作。
这些天忙着做卒业计划,忙着敲代码,早发明像本来那样“无聊”的把那些手艺笔墨再敲一遍是没有多粗心义的,由于写出它们所用的工夫如果细心在看大概再用代码做几个实践的例子应当更好吧,实在这是早晓得的,那之前晓得还那末干,次要是由于太想做先生了吧!如今呢,不那末干不写了是由于临时保持做先生的盘算吧,这两天余暇的时分温习数据库,翻到了之前的所写的一个存储历程“主键天生器”,SQLServer版本的是在之前项目顶用过的,Oracle版本的是前面进修Oracle时补上的,不论怎样,有看了一遍,敲了一遍,未来面视的时分大概用得着吧。

SQLServer版

USETEST

IFEXISTS(SELECTnameFROMsysobjects--反省体系中是不是有与自界说存储历程同名的工具

WHEREname=getNoANDtype=P)

DROPPROCEDUREgetNo

GO

CREATEPROCEDUREgetNo

@precRecordvarchar(10),--3个参数。第1个为输出参数(表名);第3个为输出

--参数(用以判别输入格局);;第2个为输入参数(最初天生的主键编号)

@primarykeyvarchar(12)output,--若第3个参数即是0时,主键=字轨+时代+编号

--若第3个参数即是1时,主键=字轨+编号

@signsmallint--若第3个参数即是其他时报错

AS

declare@prctmpdatedatetime,--一时变量,用以纪录存储过程当中的两头变量

@todaydatetime,

@tmpprenumvarchar(4),

@tmpwordvarchar(2),

@year1varchar(2),

@day1varchar(2),

@month1varchar(2)------------------------------------------------------------------------------------------------------------

set@today=getdate()

ifnotexists(selectfRecordfromtbrecnowherefRecord=@precRecord)--若表中没有与参数1同名的则新拔出一条

begin

insertintotbrecno(fRecord,Predate,Prenum,Word)values(@precRecord,@today,1,left(@precRecord,2))

end

else

begin

select@prctmpdate=PredatefromtbrecnowherefRecord=@precRecord

if(datediff(day,@today,@prctmpdate)<0)--对照若以后日期<前次日期,令

--前次日期=前次日期且前次编号置为零

begin

updatetbrecnosetPrenum=1,predate=@todaywherefRecord=@precRecord

end

elseif(datediff(day,@today,@prctmpdate)=0)--若以后日期=前次日期,令前次编号加一

begin

updatetbrecnosetPrenum=Prenum+1wherefRecord=@precRecord

end

elseif(datediff(day,@today,@prctmpdate)>0)--若以后日期〈前次日期,报错

begin

raiserror(thedbserverdateerreorchecksystemdateplease!,16,1)

end

end

---------------------------------------------------------------------------------------------------------------



select@prctmpdate=Predate,@tmpword=Word,@tmpprenum=prenumfromtbrecnowherefRecord=@precRecord

select@tmpprenum=--前次编号不敷四位的补够四位

caselen(ltrim(rtrim(@tmpprenum)))

when1then000+rtrim(ltrim(@tmpprenum))

when2then00+rtrim(ltrim(@tmpprenum))

when3then0+rtrim(ltrim(@tmpprenum))

when4thenrtrim(ltrim(@tmpprenum))

end

-----------------------------------------------------------------------------------------------------------------

set@year1=right(ltrim(rtrim((str(year(@prctmpdate))))),2)--掏出年份

select@month1=

caselen(ltrim(str(month(@prctmpdate))))--掏出月份,若不敷两位的补够两位

when1then0+ltrim(str(month(@prctmpdate)))

when2thenltrim(str(month(@prctmpdate)))

end

select@day1=--掏出天数,若不敷两位的补够两位

caselen(ltrim(str(day(@prctmpdate))))

when1then0+ltrim(str(day(@prctmpdate)))

when2thenltrim(str(day(@prctmpdate)))

end

----------------------------------------------------------------------------------------------------------------

if@sign=1

begin--判别输入范例

set@primarykey=rtrim(ltrim(@tmpword))+@tmpprenum

end

elseif@sign=0

begin

set@primarykey=@tmpword+@year1+@month1+@day1+@tmpprenum

end

else

begin

raiserror(parametererror,16,1)

end

--------------------------------------------------------------------------

GO

-------------------------------------------------------------------

--测试

declare@mybillnovarchar(12)

execgetNopG,@mybillnooutput,0

select@mybillno

--IFEXISTS(select*fromTbrecnowhereword=left(ltrim(rtrim(@precRecord)),2))

--raiserror(表名的前两个字母与已有的产生抵触请修正表名,16,1)

--deletetbrecno

--
--select*fromtbrecno
Oracle版

createorreplaceproceduregetmykeyno(
signvarchar2,
tablenamevarchar2,
outkeyoutvarchar2
)
is

--signgetmykey.my_ziguei%type;
--tablenamegetmykey.my_tablename%type;
--outkeyvarchar(20);

lastdategetmykey.my_lastdate%type;
tmpintgetmykey.my_lastno%type;
nowdatedate;
tmpStrvarchar(4);
tmpsignvarchar(2);

myyearint;
mymonthint;
mydayint;

tmpcountint;

begin
myyear:=extract(yearfromsysdate);
mymonth:=extract(monthfromsysdate);
myday:=extract(dayfromsysdate);

nowdate:=sysdate;
--tablename:=aaaa;
--sign:=ad;

selectcount(*)intotmpcountfromgetmykeywheremy_tablename=tablename;
iftmpcount=0then

begin
insertintogetmyke(my_tablename,my_ziguei,my_lastno,my_lastdate)values(tablename,sign,1,nowdate);tmpInt:=1;
end;
else
selectmy_lastdateintolastdatefromgetmykeywheremy_tablename=tablename;

if(myyear>=extract(yearfromlastdate)andmymonth>=extract(monthfromlastdate))then

if(myday=extract(dayfromlastdate))then

updategetmykeysetmy_lastno=my_lastno+1wheremy_tablename=tablename;
selectmy_lastnointotmpintfromgetmykeywheremy_tablename=tablename;

else
if(myday>extract(dayfromlastdate))then

updategetmykeysetmy_lastno=1wheremy_tablename=tablename;
updategetmykeysetmy_lastdate=nowdatewheremy_tablename=tablename;
tmpInt:=1;
else
dbms_output.put_line(服务器的工夫改动,请反省体系!);
endif;

endif;
endif;

endif;
tmpStr:=lpad(to_char(tmpint),4,0);

--dbms_output.put_line(tmpstr);

outkey:=substr(to_char(myyear),3,2)||lpad(to_char(mymonth),2,0)||lpad(to_char(myday),2,0)||tmpStr;
selectmy_zigueiintotmpsignfromgetmykeywheremy_tablename=tablename;

outkey:=tmpsign||outkey;
--dbms_output.put_line(outkey);

end;


 
导致了一个使用几乎和mSQL一样的API接口的用于他们的数据库的新的SQL接口的产生,这样,这个API被设计成允许为用于mSQL而写的第三方代码更容易移植到MySQL。
金色的骷髅 该用户已被删除
沙发
发表于 2015-1-19 18:06:17 | 只看该作者
Mirror可以算是SQLServer的Dataguard了。但是能不能被大伙用起来就不知道了。
变相怪杰 该用户已被删除
板凳
发表于 2015-2-4 16:49:38 | 只看该作者
多加的系统视图和实时系统信息这些东西对DBA挑优非常有帮助,但是感觉粒度还是不太细。
蒙在股里 该用户已被删除
地板
发表于 2015-2-10 04:17:23 | 只看该作者
还不是性能有问题!否则面向对象的数据库早就实现了!建议使用CLR的地方一般是和应用的复杂程度或操作系统环境有很高的耦合度的场景。如你想构建复杂的算法,并且用到了大量的指针和高级数据模型。
5#
发表于 2015-2-28 19:35:34 | 只看该作者
所以你总能得到相应的升级版本,来满足你的需求。
若相依 该用户已被删除
6#
发表于 2015-3-10 07:05:39 | 只看该作者
这是一个不错的新特性。虽然索引的附加字段没有索引键值效率高,但是相对映射到数据表中效率还是提高了很多。我做过试验,在我的实验环境中会比映射到表中提高30%左右的效率。
谁可相欹 该用户已被删除
7#
发表于 2015-3-17 05:07:54 | 只看该作者
至于淘汰的问题,只能说在你的项目周期之内,微软应该都不会倒闭。
灵魂腐蚀 该用户已被删除
8#
发表于 2015-3-23 20:38:48 | 只看该作者
在select语句中可以使用groupby子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句限制返回的结果集。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-21 06:40

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表