网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 交易代码 > SQL语法 > 正文

存储过程学习资料

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务

【网学网提醒】:网学会员为大家收集整理了存储过程学习资料提供大家参考,希望对大家有所帮助!


    sqlserver存储过程学习资料一
    2009-01-1210:44:02|分类:数据库|字号订阅CREATEPROCEDURE创建存储过程,存储过程是保存起来的可以接受和返回用户提供的参数的Transact-SQL语句的集合。可以创建一个过程供永久使用,或在一个会话中临时使用(局部临时过程),或在所有会话中临时使用(全局临时过程)。也可以创建在MicrosoftSQLServer启动时自动运行的存储过程。语法CREATEPROC[EDURE]procedure_name[;number][{@parameterdata_type}[VARYING][=default][OUTPUT]][,...n][WITH{RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}][FORREPLICATION]ASsql_statement[...n]参数procedure_name新存储过程的名称。过程名必须符合标识符规则,且对于数据库及其所有者必须唯一。有关更多信息,请参见使用标识符。要创建局部临时过程,可以在procedure_name前面加一个编号符(#procedure_name),要创建全局临时过程,可以在procedure_name前面加两个编号符(##procedure_name)。完整的名称(包括#或##)不能超过128个字符。指定过程所有者的名称是可选的。;number是可选的整数,用来对同名的过程分组,以便用一条DROPPROCEDURE语句即可将同组的过程一起除去。例如,名为orders的应用程序使用的过程可以命名为orderproc;1、orderproc;2等。DROPPROCEDUREorderproc语句将除去整个组。如果名称中包含定界标识符,则数字不应包含在标识符中,只应在procedure_name前后使用适当的定界符。
     @parameter过程中的参数。在CREATEPROCEDURE语句中可以声明一个或多个参数。用户必须在执行过程时提供每个所声明参数的值(除非定义了该参数的默认值)。存储过程最多可以有2.100个参数。使用@符号作为第一个字符来指定参数名称。参数名称必须符合标识符的规则。每个过程的参数仅用于该过程本身;相同的参数名称可以用在其它过程中。默认情况下,参数只能代替常量,而不能用于代替表名、列名或其它数据库对象的名称。有关更多信息,请参见EXECUTE。data_type参数的数据类型。所有数据类型(包括text、ntext和image)均可以用作存储过程的参数。不过,cursor数据类型只能用于OUTPUT参数。如果指定的数据类型为cursor,也必须同时指定VARYING和OUTPUT关键字。有关SQLServer提供的数据类型及其语法的更多信息,请参见数据类型。说明对于可以是cursor数据类型的输出参数,没有最大数目的限制。VARYING指定作为输出参数支持的结果集(由存储过程动态构造,内容可以变化)。仅适用于游标参数。default参数的默认值。如果定义了默认值,不必指定该参数的值即可执行过程。默认值必须是常
    量或NULL。如果过程将对该参数使用LIKE关键字,那么默认值中可以包含通配符(*、_、[]和[^])。OUTPUT表明参数是返回参数。该选项的值可以返回给EXEC[UTE]。使用OUTPUT参数可将信息返回给调用过程。Text、ntext和image参数可用作OUTPUT参数。使用OUTPUT关键字的输出参数可以是游标占位符。n表示最多可以指定2.100个参数的占位符。{RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}RECOMPILE表明SQLServer不会缓存该过程的计划,该过程将在运行时重新编译。在使用非典型值或临时值而不希望覆盖缓存在内存中的执行计划时,请使用RECOMPILE选项。ENCRYPTION表示SQLServer加密syscomments表中包含CREATEPROCEDURE语句文本的条目。使用ENCRYPTION可防止将过程作为SQLServer复制的一部分发布。说明在升级过程中,SQLServer利用存储在syscomments中的加密注释来重新创建加密过程。
     FORREPLICATION指定不能在订阅服务器上执行为复制创建的存储过程。.使用FORREPLICATION选项创建的存储过程可用作存储过程筛选,且只能在复制过程中执行。本选项不能和WITHRECOMPILE选项一起使用。AS指定过程要执行的操作。sql_statement过程中要包含的任意数目和类型的Transact-SQL语句。但有一些限制。n是表示此过程可以包含多条Transact-SQL语句的占位符。注释存储过程的最大大小为128MB。用户定义的存储过程只能在当前数据库中创建(临时过程除外,临时过程总是在tempdb中创建)。在单个批处理中,CREATEPROCEDURE语句不能与其它Transact-SQL语句组合使用。默认情况下,参数可为空。如果传递NULL参数值并且该参数在CREATE或ALTERTABLE语句中使用,而该语句中引用的列又不允许使用NULL,则SQLServer会产生一条错误信息。为了防止向不允许使用NULL的列传递NULL参数值,应向过程中添加编程逻辑或为该列使用默认值(使用CREATE或ALTERTABLE的DEFAULT关键字)。建议在存储过程的任何CREATETABLE或ALTERTABLE语句中都为每列显式指定NULL或NOTNULL,例如在创建临时表时。ANSI_DFLT_ON和ANSI_DFLT_OFF选项控制SQLServer为列指派NULL或NOTNULL特性的方式(如果在CREATETABLE或ALTERTABLE语句中没有指定的话)。如果某个连接执行的存储过程对这些选项的设置与创建该过程的连接的设置不同,则为第二个连接创建的表列可能会有不同的为空性,并且表现出不同的行为方式。如果为每个列显式声明了NULL或NOTNULL,那么将对所有执行该存储过程的连接使用相同的为空性创建临时表。在创建或更改存储过程时,SQLServer将保存SETQUOTED_IDENTIFIER和SETANSI_NULLS的设置。执行存储过程时,
    将使用这些原始设置。因此,所有客户端会话的SETQUOTED_IDENTIFIER和SETANSI_NULLS设置在执行存储过程时都将被忽略。在存储过程中出现的SETQUOTED_IDENTIFIER和SETANSI_NULLS语句不影响存储过程的功能。其它SET选项(例如SETARITHABORT、SETANSI_WARNINGS或SETANSI_PADDINGS)在创建或更改存储过程时不保存。如果存储过程的逻辑取决于特定的设置,应在过程开头添加一条SET语句,以确保设置正确。从存储过程中执行SET语句时,该设置只在存储过程完成之前有效。之后,设置将恢复为调用存储过程时的值。这使个别的客户端可以设置所需的选项,而不会影响存储过程的逻辑。
     说明SQLServer是将空字符串解释为单个空格还是解释为真正的空字符串,由兼容级别设置控制。如果兼容级别小于或等于65,SQLServer就将空字符串解释为单个空格。如果兼容级别等于70,SQL则Server将空字符串解释为空字符串。有关更多信息,请参见sp_dbcmptlevel。获得有关存储过程的信息若要显示用来创建过程的文本,请在过程所在的数据库中执行sp_helptext,并使用过程名作为参数。说明使用ENCRYPTION选项创建的存储过程不能使用sp_helptext查看。若要显示有关过程引用的对象的报表,请使用sp_depends。若要为过程重命名,请使用sp_rename。引用对象SQLServer允许创建的存储过程引用尚不存在的对象。在创建时,只进行语法检查。执行时,如果高速缓存中尚无有效的计划,则编译存储过程以生成执行计划。只有在编译过程中才解析存储过程中引用的所有对象。因此,如果语法正确的存储过程引用了不存在的对象,则仍可以成功创建,但在运行时将失败,因为所引用的对象不存在。有关更多信息,请参见延迟名称解析和编译。延迟名称解析和兼容级别SQLServer允许Transact-SQL存储过程在创建时引用不存在的表。这种能力称为延迟名称解析。不过,如果Transact-SQL存储过程引用了该存储过程中定义的表,而兼容级别设置(通过执行sp_dbcmptlevel来设置)为65,则在创建时会发出警告信息。而如果在运行时所引用的表不存在,将返回错误信息。有关更多信息,请参见sp_dbcmptlevel和延迟名称解析和编译。执行存储过程成功执行CREATEPROCEDURE语句后,过程名称将存储在sysobjects系统表中,CREATE而PROCEDURE语句的文本将存储在syscomments中。第一次执行时,将编译该过程以确定检索数据的最佳访问计划。使用cursor数据类型的参数存储过程只能将cursor数据类型用于OUTPUT参数。如果为某个参数指定了cursor数据类型,也必须指定VARYING和OUTPUT参数。如果为某个参
    数指定了VARYING关键字,则数据类型必须是cursor,并且必须指定OUTPUT关键字。说明cursor数据类型不能通过数据库API(例如OLEDB、ODBC、ADO和DB-Library)绑定到应用程序变量上。因为必须先绑定OUTPUT参数,应用程序才可以执行存储过程,所以带有cursorOUTPUT参数的存储过程不能通过数据库API调用。只有将cursorOUTPUT变量赋值给Transact-SQL局部cursor变量时,才可以通过Transact-SQL批处理、存储过程或触发器调用这些过程。
     Cursor输出参数在执行过程时,以下规则适用于cursor输出参数:对于只进游标,游标的结果集中返回的行只是那些存储过程执行结束时处于或超出游标位置的行,例如:在过程中的名为RS的100行结果集上打开一个非滚动游标。过程提取结果集RS的头5行。过程返回到其调用者。返回到调用者的结果集RS由RS的第6到100行组成,调用者中的游标处于RS的第一行之前。对于只进游标,如果存储过程完成后,游标位于第一行的前面,则整个结果集将返回给调用批处理、存储过程或触发器。返回时,游标将位于第一行的前面。
    sqlserver存储过程学习资料二
    2009-01-1210:44:55|分类:数据库|字号订阅对于只进游标,如果存储过程完成后,游标的位置超出最后一行的结尾,则为调用批处理、存储过程或触发器返回空结果集。说明空结果集与空值不同。对于可滚动游标,在存储过程执行结束时,结果集中的所有行均会返回给调用批处理、存储过程或触发器。返回时,游标保留在过程中最后一次执行提取时的位置。对于任意类型的游标,如果游标关闭,则将空值传递回调用批处理、存储过程或触发器。如果将游标指派给一个参数,但该游标从未打开过,也会出现这种情况。说明关闭状态只有在返回时才有影响。例如,可以在过程中关闭游标,稍后再打开游标,然后将该游标的结果集返回给调用批处理、存储过程或触发器。临时存储过程SQLServer支持两种临时过程:局部临时过程和全局临时过程。局部临时过程只能由创建该过程的连接使用。全局临时过程则可由所有连接使用。局部临时过程在当前会话结束时自动除去。全局临时过程在使用该过程的最后一个会话结束时除去。通常是在创建该过程的会话结束时。临时过程用#和##命名,可以由任何用户创建。创建过程后,局部过程的所有者是唯一可以使用该过程的用户。执行局部临时过程的权限不能授予其他用户。如果创建了全局临时过程,则所有用户均可
     以访问该过程,权限不能显式废除。只有在tempdb数据库中具有显式CREATEPROCEDURE权限的用户
    ,才可以在该数据库中显式创建临时过程(不使用编号符命名)。可以授予或废除这些过程中的权限。说明频繁使用临时存储过程会在tempdb中的系统表上产生争用,从而对性能产生负面影响。建议使用sp_executesql代替。sp_executesql不在系统表中存储数据,因此可以避免这一问题。自动执行存储过程SQLServer启动时可以自动执行一个或多个存储过程。这些存储过程必须由系统管理员创建,并在sysadmin固定服务器角色下作为后台过程执行。这些过程不能有任何输入参数。对启动过程的数目没有限制,但是要注意,每个启动过程在执行时都会占用一个连接。如果必须在启动时执行多个过程,但不需要并行执行,则可以指定一个过程作为启动过程,让该过程调用其它过程。这样就只占用一个连接。在启动时恢复了最后一个数据库后,即开始执行存储过程。若要跳过这些存储过程的执行,请将启动参数指定为跟踪标记4022。如果以最低配置启动SQLServer(使用-f标记),则启动存储过程也不会执行。有关更多信息,请参见跟踪标记。若要创建启动存储过程,必须作为sysadmin固定服务器角色的成员登录,并在master数据库中创建存储过程。使用sp_procoption可以:将现有存储过程指定为启动过程。停止在SQLServer启动时执行过程。查看SQLServer启动时执行的所有过程的列表。存储过程嵌套存储过程可以嵌套,即一个存储过程可以调用另一个存储过程。在被调用过程开始执行时,嵌套级将增加,在被调用过程执行结束后,嵌套级将减少。如果超出最大的嵌套级,会使整个调用过程链失败。可用@@NESTLEVEL函数返回当前的嵌套级。若要估计编译后的存储过程大小,请使用下列性能监视计数器。性能监视器对象名性能监视计数器名称SQLServer:缓冲区管理器高速缓存大小(页面数)SQLServer:高速缓存管理器高速缓存命中率高速缓存页
     高速缓存对象计数**各种分类的高速缓存对象均可以使用这些计数器,包括特殊sql、准备sql、过程、触发器等。有关更多信息,请参见SQLServer:BufferManager对象和SQLServer:CacheManager对象。sql_statement限制除了SETSHOWPLAN_TEXT和SETSHOWPLAN_ALL之外(这两个语句必须是批处理中仅有的语句),任何SET语句均可以在存储过程内部指定。所选择的SET选项在存储过程执行过程中有效,之后恢复为原来的设置。如果其他用户要使用某个存储过程,那么在该存储过程内部,一些语句使用的对象名必须使用对象所有者的名称限定。这些语句包括:ALTERTABLECREATEINDEXCREATETABLE所有DBCC语句DROPTABLEDROPINDEXTRUNCATET
    ABLEUPDATESTATISTICS权限CREATEPROCEDURE的权限默认授予sysadmin固定服务器角色成员和db_owner和db_ddladmin固定数据库角色成员。sysadmin固定服务器角色成员和db_owner固定数据库角色成员可以将CREATEPROCEDURE权限转让给其他用户。执行存储过程的权限授予过程的所有者,该所有者可以为其它数据库用户设置执行权限。示例A.使用带有复杂SELECT语句的简单过程下面的存储过程从四个表的联接中返回所有作者(提供了)、出版的书籍以及出版社。该存储过程不使用任何参数。USEpubs
     IFEXISTS(SELECTnameFROMsysobjectsWHEREname='au_info_all'ANDtype='P')DROPPROCEDUREau_info_allGOCREATEPROCEDUREau_info_allASSELECTau_lname,au_fname,title,pub_nameFROMauthorsaINNERJOINtitleauthortaONa.au_id=ta.au_idINNERJOINtitlestONt.title_id=ta.title_idINNERJOINpublisherspONt.pub_id=p.pub_idGOau_info_all存储过程可以通过以下方法执行:EXECUTEau_info_all--OrEXECau_info_all如果该过程是批处理中的第一条语句,则可使用:au_info_allB.使用带有参数的简单过程下面的存储过程从四个表的联接中只返回指定的作者(提供了)、出版的书籍以及出版社。该存储过程接受与传递的参数精确匹配的值。USEpubsIFEXISTS(SELECTnameFROMsysobjectsWHEREname='au_info'ANDtype='P')
     DROPPROCEDUREau_infoGOUSEpubsGOCREATEPROCEDUREau_info@lastnamevarchar(40),@firstnamevarchar(20)ASSELECTau_lname,au_fname,title,pub_nameFROMauthorsaINNERJOINtitleauthortaONa.au_id=ta.au_idINNERJOINtitlestONt.title_id=ta.title_idINNERJOINpublisherspONt.pub_id=p.pub_idWHEREau_fname=@firstnameANDau_lname=@lastnameGOau_info存储过程可以通过以下方法执行:EXECUTEau_info'Dull','Ann'--OrEXECUTEau_info@lastname='Dull',@firstname='Ann'--OrEXECUTEau_info@firstname='Ann',@lastname='Dull'--OrEXECau_info'Dull','Ann'
     --OrEXECau_info@lastname='Dull',@firstname='Ann'--OrEXECau_info@firstname='Ann',@lastname='Dull'如果该过程是批处理中的第一条语句,则可使用:au_info'Dull','Ann'--Orau_info@lastname='Dull',@firstname='Ann'--Orau_info@firstname='Ann',@lastname='Dull'C.使用带有通配符参数的简单过程下面的存储过程从四个表的联接中只返回指定的作者(提供了)、出版的书籍以及出版社。该存储过程对传递的参数进行模式匹配,如果没有提供参数,则使用预设的默认值。USEpubsIFEXISTS(SELECTnameFROMsysobjectsWHEREname='au_info2'ANDtype='P')DROPPROCEDUREau_info2GOUSEpubsGOCREATEPROCEDUREau_info2@lastnamevarchar(30)='D*',@firstnamevarchar(18)='*'AS
     SELECTau_lname,au_fname,title,pub_nameFROMauthorsaINNERJOINtitleauthortaONa
    .au_id=ta.au_idINNERJOINtitlestONt.title_id=ta.title_idINNERJOINpublisherspONt.pub_id=p.pub_idWHEREau_fnameLIKE@firstnameANDau_lnameLIKE@lastnameGOau_info2存储过程可以用多种组合执行。下面只列出了部分组合:EXECUTEau_info2--OrEXECUTEau_info2'Wh*'--OrEXECUTEau_info2@firstname='A*'--OrEXECUTEau_info2'[CK]ars[OE]n'--OrEXECUTEau_info2'Hunter','Sheryl'--OrEXECUTEau_info2'H*','S*'D.使用OUTPUT参数OUTPUT参数允许外部过程、批处理或多条Transact-SQL语句访问在过程执行期间设置的某个值。下面的示例创建一个存储过程(titles_sum),并使用一个可选的输入参数和一个输出参数。首先,创建过程:
     USEpubsGOIFEXISTS(SELECTnameFROMsysobjectsWHEREname='titles_sum'ANDtype='P')DROPPROCEDUREtitles_sumGOUSEpubsGOCREATEPROCEDUREtitles_sum@@TITLEvarchar(40)='*',@@SUMmoneyOUTPUTASSELECT'TitleName'=titleFROMtitlesWHEREtitleLIKE@@TITLESELECT@@SUM=SUM(price)FROMtitlesWHEREtitleLIKE@@TITLEGO接下来,将该OUTPUT参数用于控制流语言。说明OUTPUT变量必须在创建表和使用该变量时都进行定义。参数名和变量名不一定要匹配,不过数据类型和参数位置必须匹配(除非使用@@SUM=variable形式)。DECLARE@@TOTALCOSTmoneyEXECUTEtitles_sum'The*',@@TOTALCOSTOUTPUTIF@@TOTALCOST<200
     BEGINPRINT''PRINT'Allofthesetitlescanbepurchasedforlessthan$200.'ENDELSESELECT'Thetotalcostofthesetitlesis
  • 下一篇资讯: 如何使用SQLyog
  • 设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
    版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师
    +RTRIM(CAST(@@TOTALCOSTASvarchar(20)))下面是结果集:TitleName-----------------------------------------------------------------------TheBusyExecutive'sDatabaseGuideTheGourmetMicrowaveThePsychologyofComputerCooking(3row(s)affected)Warning,nullvalueeliminatedfromaggregate.Allofthesetitlescanbepurchasedforlessthan$200.E.使用OUTPUT游标参数OUTPUT游标参数用来将存储过程的局部游标传递回调用批处理、存储过程或触发器。首先,创建以下过程,在titles表上声明并打开一个游标:USEpubsIFEXISTS(SELECTnameFROMsysobjectsWHEREname='titles_cursor'andtype='P')DROPPROCEDUREtitles_cursorGO
         CREATEPROCEDUREtitles_cursor@titles_cursorCURSORVARYINGOUTPUTASSET@titles_cursor=CURSORFORWARD_ONLYSTATICFORSELECT*FROMtitlesOPEN@titles_cursorGO接下来,执行一个批处理,声明一个局部游标变量,执行上述过程以将游标赋值给局部变量,然后从该游标提取行。USEpubsGODECLARE@MyCursorCURSOREXECtitles_cursor@titles_cursor=@MyCursorOUTPUTWHILE(@@FETCH_STATUS=0)BEGINFETCHNEXTFROM@MyCursorENDCLOSE@MyCursorDEALLOCATE@MyCursorGOF.使用WITHRECOMPILE选项如果为过程提供的参数不是典型的参数,并且新的执行计划不应高速缓存或存储在内存中,WITHRECOMPILE子句会很有帮助
        。USEpubs
         IFEXISTS(SELECTnameFROMsysobjectsWHEREname='titles_by_author'ANDtype='P')DROPPROCEDUREtitles_by_authorGOCREATEPROCEDUREtitles_by_author@@LNAME_PATTERNvarchar(30)='*'WITHRECOMPILEASSELECTRTRIM(au_fname)+''+RTRIM(au_lname)AS'Authorsfullname',titleASTitleFROMauthorsaINNERJOINtitleauthortaONa.au_id=ta.au_idINNERJOINtitlestONta.title_id=t.title_idWHEREau_lnameLIKE@@LNAME_PATTERNGOG.使用WITHENCRYPTION选项WITHENCRYPTION子句对用户隐藏存储过程的文本。下例创建加密过程,使用sp_helptext系统存储过程获取关于加密过程的信息,然后尝试直接从syscomments表中获取关于该过程的信息。IFEXISTS(SELECTnameFROMsysobjectsWHEREname='encrypt_this'ANDtype='P')DROPPROCEDUREencrypt_thisGOUSEpubsGOCREATEPROCEDUREencrypt_this
         WITHENCRYPTIONASSELECT*FROMauthorsGOEXECsp_helptextencrypt_this下面是结果集:Theobject'scommentshavebeenencrypted.接下来,选择加密存储过程内容的标识号和文本。SELECTc.id,c.textFROMsyscommentscINNERJOINsysobjectsoONc.id=o.idWHEREo.name='encrypt_this'下面是结果集:说明text列的输出显示在单独一行中。执行时,该信息将与id列信息出现在同一行中。idtext
        ---------------------------------------------------------------------1413580074?????????????????????????????????e??????????????????????????????????????????????????????????????????????????(1row(s)affected)H.创建用户定义的系统存储过程下面的示例创建一个过程,显示表名以emp开头的所有表及其对应的索引。如果没有指定参数,该过程将返回表名以sys开头的所有表(及索引)。IFEXISTS(SELECTnameFROMsysobjectsWHEREname='sp_showindexes'ANDtype='P')
         DROPPROCEDUREsp_showindexesGOUSEmasterGOCREATEPROCEDUREsp_showindexes@@TABLEvarchar(30)='sys*'ASSELECTo.nameASTABLE_NAME,i.nameASINDEX_NAME,indidASINDEX_IDFROMsysindexesiINNERJOINsysobjectsoONo.id=i.idWHEREo.nameLIKE@@TABLEGOUSEpubsEXECsp_showindexes'emp*'GO下面是结果集:TABLE_NAMEINDEX_NAMEINDEX_ID
        -----------------------------------------------employeeemployeeemployee_indPK_emp_id12
        (2row(s)affected)I.使用延迟名称解析
         下面的示例显示四个过程以及延迟名称解析的各种可能使用方式。尽管引用的表或列在编译时不存在,但每个存储过程都可创建。IFEXISTS(SELECTnameFROMsysobjectsWHEREname='proc1'ANDtype='P')DROPPROCEDUREproc1GO--Creatingaprocedureonanonexistenttable.USEpubsGOCREATEPROCEDUREproc1ASSELECT*FROMdoes_not_existGO--Hereisthestatementtoactuallyseethetextoftheprocedure.SELECTo.id,c.textFROMsysobjectsoINNERJOINsyscommentscONo.id=c.idWHEREo.type='P'ANDo.name='proc1'GOUSEmasterGOIFEXISTS(SELECTna
        meFROMsysobjectsWHEREname='proc2'ANDtype='P')
         DROPPROCEDUREproc2GO--Creatingaprocedurethatattemptstoretrieveinformationfroma--nonexistentcolumninanexistingtable.USEpubsGOCREATEPROCEDUREproc2ASDECLARE@middle_initchar(1)SET@middle_init=NULLSELECTau_id,middle_initial=@middle_initFROMauthorsGO--Hereisthestatementtoactuallyseethetextoftheprocedure.SELECTo.id,c.textFROMsysobjectsoINNERJOINsyscommentscONo.id=c.idWHEREo.type='P'ando.name='proc2'获得有关存储过程的信息若要显示用来创建过程的文本,请在过程所在的数据库中执行sp_helptext,并使用过程名作为参数。说明使用ENCRYPTION选项创建的存储过程不能使用sp_helptext查看。若要显示有关过程引用的对象的报表,请使用sp_depends。若要为过程重命名,请使用sp_rename。执行存储过程
         成功执行CREATEPROCEDURE语句后,过程名称将存储在sysobjects系统表中,CREATE而PROCEDURE语句的文本将存储在syscomments中。第一次执行时,将编译该过程以确定检索数据的最佳访问计划。
        存储过程编写经验和优化措施(学习资料)存储过程编写经验和优化措施(学习资料)
        2009-01-1210:45:32|分类:数据库|字号订阅一、适合读者对象:数据库开发程序员,数据库的数据量很多,涉及到对SP(存储过程)的优化的项目开发人员,对数据库有浓厚兴趣的人。二、介绍:在数据库的开发过程中,经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用SP来封装数据库操作。如果项目的SP较多,书写又没有一定的规范,将会影响以后的系统维护困难和大SP逻辑的难以理解,另外如果数据库的数据量大或者项目对SP的性能要求很,就会遇到优化的问题,否则速度有可能很慢,经过亲身经验,一个经过优化过的SP要比一个性能差的SP的效率甚至高几百倍。三、内容:1、开发人员如果用到其他库的Table或View,务必在当前库中建立View来实现跨库操作,最好不要直接使用“databse.dbo.table_name”,因为sp_depends不能显示出该SP所使用的跨库table或view,不方便校验。2、开发人员在提交SP前,必须已经使用setshowplanon分析过查询计划,做过自身的查询优化检查。3、高程序运行效率,优化应用程序,在SP编写过程中应该注意以下几点:a)SQL的使用规范:i.ii.尽量避免大事务操作,慎用holdlock子句,提高系统并发能力。尽量避免反复访问同一张或几张表,尤其是数据量较大的表,可以考虑先根据条件提取数
        据到临时表中,然后再做连接。iii.尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应
        该
        改写;如果使用了游标,就要尽量避免在游标循环中再进行表连接的操作。iv.注意where字句写法,必须考虑语句顺序,应该根据索引顺序、范围大小来确定条件子
        句的前后顺序,尽可能的让字段顺序与索引顺序相一致,范围从大到小。v.不要在where子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能
        无法正确使用索引。
         vi.
        尽量使用exists代替selectcount(1)来判断是否存在记录,count函数只有在统计表中所
        有行数时使用,而且count(1)比count(*)更有效率。vii.viii.ix.x.xi.尽量使用“>=”,不要使用“>”。注意一些or子句和union子句之间的替换注意表之间连接的数据类型,避免不同类型数据之间的连接。注意存储过程中参数和数据类型的关系。注意insert、update操作的数据量,防止与其他应用冲突。如果数据量超过200个数据
        页面(400k),那么系统将会进行锁升级,页级锁会升级成表级锁。b)索引的使用规范:i.ii.索引的创建要与应用结合考虑,建议大的OLTP表不要超过6个索引。尽可能的使用索引字段作为查询条件,尤其是聚簇索引,必要时可以通过index
        index_name来强制指定索引iii.iv.避免对大表查询时进行tablescan,必要时考虑新建索引。在使用索引字段作为条件时,如果该索引是联合索引,那么必须使用到该索引中的第一
        个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用。v.要注意索引的维护,周期性重建索引,重新编译存储过程。
        c)tempdb的使用规范:i.尽量避免使用distinct、orderby、groupby、having、join、cumpute,因为这些语句会加
        重tempdb的负担。ii.iii.避免频繁创建和删除临时表,减少系统表资源的消耗。在新建临时表时,如果一次性插入数据量很大,那么可以使用selectinto代替create
        table,避免log,提高速度;如果数据量不大,为了缓和系统表的资源,建议先createtable,然后insert。iv.如果临时表的数据量较大,需要建立索引,那么应该将创建临时表和建立索引的过程放
        在单独一个子存储过程中,这样才能保证系统能够很好的使用到该临时表的索引。v.如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先truncate
        table,然后droptable,这样可以避免系统表的较长时间锁定。vi.慎用大的临时表与其他大表的连接查询和修改,减低系统表负担,因为这种操作会在一
        条语句中多次使用tempdb的系统表。
         d)合理的算法使用:根据上面已提到的SQL优化技术和ASETuning手册中的SQL优化内容,结合实际应用,采用多种算法进行比较,以获得消
        耗资源最少、效率最高的方法。具体可用ASE调优命令:setstatisticsioon,setstatisticstimeon,setshowplanon等。
        
        
  • 上一篇资讯: 学习材料科学与工程专业需要具备的能力和素质
  • 下一篇资讯: 如何使用SQLyog
  • 相关资讯

    网学推荐

    原创论文

    文章排行榜

    设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
    版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师