仓酷云

标题: MSSQL网站制作之用SQLServer完成数据表中,将恣意一笔记... [打印本页]

作者: 若相依    时间: 2015-1-16 22:35
标题: MSSQL网站制作之用SQLServer完成数据表中,将恣意一笔记...
Mysql的存储引擎接口定义良好。有兴趣的开发者可以通过阅读文档编写自己的存储引擎。server|sqlserver|数据
--定位数据
--计划思绪:
--保留要被挪动纪录的原主键值和新主键值(假如有主键的话),然后对照两个主键值的巨细(纪录信息按升序分列),
--假如原主键值年夜,标明该纪录被挪动到后面的新地位,可将原地位的纪录信息保留上去,并将重新地位的纪录信息到
--原纪录的前一笔记录的信息依次往下挪动,把保留的原纪录挪动到新地位便可。
--假如原主键值小,标明该纪录被挪动到前面的新地位,可将原地位的纪录信息保留上去,并将重新地位的纪录信息到
--原纪录的下一笔记录的信息依次往上挪动,把保留的原纪录挪动到新地位便可。实践上就是纪录块的挪动.
--可是,假如数据表中的数据十分复杂,该存储历程的实行效力将会下落.


Usezzydb

--创立举例表(先生信息表)
CreateTableT_StudentsInfo
(i_idintidentity(1,1),--体系自增流水号
c_Stu_IDnvarchar(10),--学号
c_ClassNamenvarchar(50),--班级
d_BirthDaydatetime)--出身日期
go

--向举例表中拔出4条先生信息,以考证上面的存储历程(sp_MyAdjustRecordOrder)
InsertintoT_StudentsInfovalues(001,年夜二三班,1978-01-25)
InsertintoT_StudentsInfovalues(002,年夜一六班,1979-02-05)
InsertintoT_StudentsInfovalues(003,年夜四三班,1981-07-15)
InsertintoT_StudentsInfovalues(004,年夜三一班,1976-01-05)

select*fromT_StudentsInfo

ifobject_id(sp_MyAdjustRecordOrder)0
dropprocsp_MyAdjustRecordOrder
go

CreateProcsp_MyAdjustRecordOrder(@OldStuIdnvarchar(10),@NewStuIdnvarchar(10))
as
--@OldStuid先生学号(用以暗示被挪动的纪录),
--@NewStuid先生学号(用以暗示将被挪动的纪录拔出的新地位)
begin
declare@Old_i_idint,@New_i_idint
declare@i_BlockCountint--行将被挪动的纪录块条数
declare@iint--轮回变量

--取得id值
Select@Old_i_id=(selectI_idfromT_StudentsInfowherec_Stu_ID=@OldStuId)
Select@New_i_id=(selectI_idfromT_StudentsInfowherec_Stu_ID=@NewStuId)
select@i_BlockCount=abs(@Old_i_id-@New_i_id)

--保留被挪动的先生信息
Selectc_Stu_ID,c_ClassName,d_BirthDay
intoNew_StudentsInfo--一时创立的表,用完后删除
fromT_StudentsInfo
wherec_Stu_ID=@OldStuId


if@New_i_id<@Old_i_id--将原纪录信息挪动到了后面
begin
select@i=0
while@i<=@i_BlockCount-1
begin
updateT_StudentsInfo
setc_Stu_ID=T2.c_Stu_ID,
c_ClassName=T2.c_ClassName,
d_BirthDay=T2.d_BirthDay
FromT_StudentsInfo,T_StudentsInfoT2
where(T_StudentsInfo.i_id=@Old_i_id-@i)and
(T2.i_id=@Old_i_id-@i-1)

select@i=@i+1
end
end

if@New_i_id>@Old_i_id--将原纪录信息挪动到了前面
begin
select@i=0
while@i<=@i_BlockCount-1
begin
updateT_StudentsInfo
setc_Stu_ID=T2.c_Stu_ID,
c_ClassName=T2.c_ClassName,
d_BirthDay=T2.d_BirthDay
FromT_StudentsInfo,T_StudentsInfoT2
where(T_StudentsInfo.i_id=@Old_i_id+@i)and
(T2.i_id=@Old_i_id+@i+1)

select@i=@i+1
end
end

updateT_StudentsInfo
setc_Stu_ID=T3.c_Stu_ID,
c_ClassName=T3.c_ClassName,
d_BirthDay=T3.d_BirthDay
FromT_StudentsInfoT1,New_StudentsInfoT3
where(T1.i_id=@New_i_id)

DroptableNew_StudentsInfo
--if@New_i_id=@Old_i_id--地位未产生改动,不做任那边理
end
go


--利用举例
--请求:将c_Stu_Id为004的先生信息挪动到c_Stu_Id为002的先生信息之前的地位.
--挪用存储历程sp_MyAdjustRecordOrder(004,002)便可.
--注重:这里的i_id必需是按次的。


--备份表数据信息,以便于对照
select*
intoStudentsInfoBackup
fromT_StudentsInfo

--对照了局是不是分歧
select*fromStudentsInfoBackup
select*fromT_StudentsInfo

--挪动数据纪录信息,挪用存储历程
execsp_MyAdjustRecordOrder003,002

--对照了局是不是修改
select*fromStudentsInfoBackup
select*fromT_StudentsInfo

在Windows中MySQL以服务形式存在,在使用前应确保此服务已经启动,未启动可用netstartmysql命令启动。而Linux中启动时可用“/etc/rc.d/init.d/mysqldstart"命令,注意启动者应具有管理员权限。
作者: 变相怪杰    时间: 2015-1-19 17:45
SQLServer的异构移植功能个人感觉最好了。(如果对比过SQLServer的链接服务器和Oracle的透明网关的朋友会发现SQLServer的sp_addlinkedserver(openquery)异构数据库系列比Oracle真是强太多了。)
作者: 不帅    时间: 2015-1-27 05:05
原来的计算字段其实和虚拟字段很像。只是管理方面好了而已,性能方面提高不多。但是SQL2005提供了计算字段的持久化,这就提高了查询的性能,但是会加重insert和update的负担。OLTP慎用。OLAP可以大规模使用。
作者: 只想知道    时间: 2015-2-4 23:30
是要和操作系统进行Socket通讯的场景。否则建议慎重!
作者: 精灵巫婆    时间: 2015-2-10 22:51
呵呵,这就是偶想说的
作者: 柔情似水    时间: 2015-3-1 17:04
不过话说回来了,绝大多数的性能优化准则与对sqlserver存储的结构理解息息相关
作者: 金色的骷髅    时间: 2015-3-10 21:22
至于淘汰的问题,只能说在你的项目周期之内,微软应该都不会倒闭。
作者: admin    时间: 2015-3-17 10:39
至于淘汰的问题,只能说在你的项目周期之内,微软应该都不会倒闭。
作者: 飘飘悠悠    时间: 2015-3-24 07:40
习惯敲命令行的朋友可能会爽一些。但是功能有限。适合机器跑不动SQLServerManagementStudio的朋友使用。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2