小魔女 发表于 2015-1-16 22:35:28

MSSQL网站制作之SqlServer分批取蹬c相PID的

有了数据以后,我们就要想一个比较统一的方法来闪回。上面我们说了对于DML操作,可以通过反向执行所有逆操作来实现,对于语句里面的DDL,只能直接跳过。原因是一个DDL不一定有直接的逆操作。server|sqlserver
1.分批取
declare@P1int
set@P1=180150000
declare@P2int
set@P2=8
declare@P3int
set@P3=1
declare@P4int
set@P4=3
execsp_cursoropen@P1output,
Nselecttop3*fromauthors,
@P2output,
@P3output,
@P4output
select@P1,@P2,@P3,@P4
go
execsp_cursorfetch180150000,16,1,1
go
execsp_cursorfetch180150000,16,2,1
go
execsp_cursorfetch180150000,16,3,1
go
execsp_cursorfetch180150000,16,4,1
go
execsp_cursorclose180150000
go


execsp_cursorfetch180150000,16,1,10--第1P起,取10P
execsp_cursorclose180150000
go

2.取相PID的

Thetable-valuedfunctionfn_FindReports(InEmpID),which--givenanEmployeeID--returnsatablecorrespondingtoalltheemployeesthatreporttothegivenemployeedirectlyorindirectly.Thislogicisnotexpressibleinasinglequeryandisagoodcandidateforimplementingasauser-definedfunction.

CREATEFUNCTIONfn_FindReports(@InEmpIdnchar(5))
RETURNS@retFindReportsTABLE(empidnchar(5)primarykey,
empnamenvarchar(50)NOTNULL,
mgridnchar(5),
titlenvarchar(30))
/*Returnsaresultsetthatlistsalltheemployeeswhoreporttogiven
employeedirectlyorindirectly.*/
AS
BEGIN
DECLARE@RowsAddedint
--tablevariabletoholdaccumulatedresults
DECLARE@reportsTABLE(empidnchar(5)primarykey,
empnamenvarchar(50)NOTNULL,
mgridnchar(5),
titlenvarchar(30),
processedtinyintdefault0)
--initialize@Reportswithdirectreportsofthegivenemployee
INSERT@reports
SELECTempid,empname,mgrid,title,0
FROMemployees
WHEREempid=@InEmpId
SET@RowsAdded=@@rowcount
--Whilenewemployeeswereaddedinthepreviousiteration
WHILE@RowsAdded>0
BEGIN
/*Markallemployeerecordswhosedirectreportsaregoingtobe
foundinthisiterationwithprocessed=1.*/
UPDATE@reports
SETprocessed=1
WHEREprocessed=0
--Insertemployeeswhoreporttoemployeesmarked1.
INSERT@reports
SELECTe.empid,e.empname,e.mgrid,e.title,0
FROMemployeese,@reportsr
WHEREe.mgrid=r.empidande.mgride.empidandr.processed=1
SET@RowsAdded=@@rowcount
/*Markallemployeerecordswhosedirectreportshavebeenfound
inthisiteration.*/
UPDATE@reports
SETprocessed=2
WHEREprocessed=1
END

--copytotheresultofthefunctiontherequiredcolumns
INSERT@retFindReports
SELECTempid,empname,mgrid,title
FROM@reports
RETURN
END
GO



对于update操作,event中依次记录旧行,新行的值。

分手快乐 发表于 2015-1-19 17:54:59

每天坚持做不一样的是,认真做笔录,定时复习。一个月你就可以有一定的收获。当然如果你想在sql方面有一定的造诣,你少不了需要看很多很多的书籍了。

小女巫 发表于 2015-1-24 16:57:44

学习SQL语言的话如果要学会去做网站就不是很难!但是要做数据库管理的话就有难度了!

小妖女 发表于 2015-2-2 11:25:05

现在是在考虑:如果写到服务器端,我一下搞他个10个存储过程导过去,那久之服务器不就成垃圾箱了吗?即便优化了我的中间层.

因胸联盟 发表于 2015-2-7 19:02:15

SP4是一个累积性的ServicePack,包含自以前的ServicePack发布以来所有的修补程序(包括MS03-031安全公告)。

谁可相欹 发表于 2015-2-23 00:25:51

一个是把SQL语句写到客户端,可以使用DataSet进行加工;

仓酷云 发表于 2015-3-7 05:00:34

备份方面可能还是一个老大难的问题。不能单独备份几个表总是感觉不爽。灵活备份的问题不知道什么时候才能解决。

admin 发表于 2015-3-14 12:14:13

可以动态传入参数,省却了动态SQL的拼写。

再见西城 发表于 2015-3-21 06:47:28

索引视图2k就有。但是2005对其效率作了一些改进但是schema.viewname的作用域真是太限制了它的应用面。还有一大堆的环境参数和种种限制都让人对它有点却步。
页: [1]
查看完整版本: MSSQL网站制作之SqlServer分批取蹬c相PID的