MSSQL教程之Transact-SQL中游标名的感化域
对于insert操作,只需要把event_type改成DELETE_ROWS_EVENT;对于delete操作,改成WRITE_ROWS_EVENT游标MicrosoftSQLServer2000撑持关头字GLOBAL和LOCAL用于DECLARECURSOR语句中游标名感化域的界说。GLOBAL指定游标名在一个毗连中是全局的。LOCAL指定游标名在存储历程,触发器,包括DECLARECURSOR的批处置语句中是部分的。
MicrosoftSQLServer7.0版本之前,在一个毗连中,游标名都是全局的。你必需先实行一个用于创立游标的存储历程,然后再实行别的一个从该游标中读取纪录的存储历程。如:
USEpubs
GO
CREATEPROCEDUREOpenCrsrAS
DECLARESampleCrsrCURSORFOR
SELECTau_lname
FROMauthors
WHEREau_lnameLIKES%
OPENSampleCrsr
GO
CREATEPROCEDUREReadCrsrAS
FETCHNEXTFROMSampleCrsr
WHILE(@@FETCH_STATUS-1)
BEGIN
FETCHNEXTFROMSampleCrsr
END
GO
EXECOpenCrsr/*声明并翻开游标SampleCrsr.*/
GO
EXECReadCrsr/*从游标SampleCrsr中读取纪录.*/
GO
CLOSESampleCrsr
GO
DEALLOCATESampleCrsr
GO
部分游标在存储历程和触发器中对游标起侧重要的回护感化。全局游标能在界说它们的存储历程或触发器外被会见。因而,它们大概在不经意的时分,在存储历程和触发器外被改动。部分游标显得更平安,由于它们不会在存储历程和触发器外被改动,除非专程的经由过程输入游标参数被传送给挪用者。
由于全局游标能够在存储历程和触发器之外被援用,以是它们大概对其他语句有不成预期的影响。比方:一个存储历程创立一个全局游标xyz,历程运转停止后游标xyz仍旧处于翻开形态,假如程序其他部分又想声明一个全局游标并定名为xyz,这时候,就会产生一个反复界说的毛病。
全局和部分游标具有分歧的定名空间,以是,在统一工夫能够呈现两个具有一样名字的全局和部分游标。Transact-SQL语法撑持游标参数,一样也撑持利用GLOBAL标识游标的感化域。假如一个游标名同时暗示全局游标和部分游标,在没有指定为GLOBAL时,此游标名将援用部分游标。
数据库选项defaulttolocalcursor把持由未指定GLOBAL和LOCAL选项的DECLARECURSOR语句创立的游标的默许感化域。假如defaulttolocalcursor选项为真,则为部分游标,反之为全局。SQLServer2000中,defaulttolocalcursors选项默许为false,用于坚持与先前版本分歧。
声明而且翻开部分游标的存储历程,能够将这些游标传出给挪用它的存储历程,触发器和批处置语句。这能够经由过程一个界说为输入参数的CURSORVARYING数据范例完成。当存储历程实行停止时,游标必需翻开,用以经由过程输入参数前往。我们能够用一个界说为CURSOR范例的部分变量援用它。
USEpubs
GO
/*Createaprocedurewithacursoroutputparameter.*/
CREATEPROCEDUREOpenCrsr@OutCrsrCURSORVARYINGOUTPUTAS
SET@OutCrsr=CURSORFOR
SELECTau_lname
FROMauthors
WHEREau_lnameLIKES%
OPEN@OutCrsr
GO
/*声明部分游标.*/
DECLARE@CrsrVarCURSOR
/*将先前的游标赋给部分变量.*/
EXECOpenCrsr@OutCrsr=@CrsrVarOUTPUT
/*使用@CrsrVar往读取纪录.*/
FETCHNEXTFROM@CrsrVar
WHILE(@@FETCH_STATUS-1)
BEGIN
FETCHNEXTFROM@CrsrVar
END
CLOSE@CrsrVar
DEALLOCATE@CrsrVar
GO
数据库API其实不撑持输入游标参数的存储历程。一个包括输入游标参数的存储历程不克不及间接被数据库API实行。这些存储历程之能够被其他的存储历程,触发器,Transact-SQL批处置,剧本挪用实行。
全局游标在没有被显式开释或毗连封闭前一向无效。部分游标默许将在存储历程,触发器,批处置停止时开释,除非它被作为输入参数输入。谁人部分游标也将在援用它的存储工程停止时被开释。
你看出了作者的深度?深处半米!当初是冲那么多的大牛给他写序才买的,后来才发现无啥内容,作者也只是才用几年的新手,百花了几十两银子,再次感叹当今社会的虚伪与浮躁 一个是把SQL语句写到客户端,可以使用DataSet进行加工; 分区表效率问题肯定是大家关心的问题。在我的试验中,如果按照分区字段进行的查询(过滤)效率会高于未分区表的相同语句。但是如果按照非分区字段进行查询,效率会低于未分区表的相同语句。 原理很简单,对要求长时间计算某一时间点的报表生成和防用户操作错误很有帮助。但是比起Oracle10g的闪回技术还是细粒度不够。可惜! 但换公司用MSSQL2K感觉自己好像根本就不了解MSSQL。什么DTS触发器以前根本没用过。 如果你是从“学习某一种数据库应用软件,从而获得应聘的资本和工作机会”的角度来问的话。 不过话说回来了,绝大多数的性能优化准则与对sqlserver存储的结构理解息息相关 如果是将来做数据库的开发设计,就应该详细学习T-SQL的各种细节,包括T-SQL的程序设计、存储过程、触发器以及具体使用某个开发语言来访问数据库。 其中最有名的应该是row_number了。这个终于解决了用临时表生成序列号的历史,而且SQLServer2005的row_number比Oracle的更先进。因为它把Orderby集成到了一起,不用像Oracle那样还要用子查询进行封装。 换言之,只有在不断的失败中尝试成功,而关于失败的总结却是很少的
页:
[1]