仓酷云

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

[学习教程] MSSQL编程:SQL Server联机丛书:存储历程及其创立...

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

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

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

x
因此我们的保存数据方法就是:在删除的动作开始之前,把表数据备份起来,然后留一个空表,在空表上执行“删除”操作。server|创立|存储历程存储历程可使得对数据库的办理、和显现关于数据库及其用户信息的事情简单很多。存储历程是SQL语句和可选把持流语句的预编译汇合,以一个称号存储并作为一个单位处置。存储历程存储在数据库内,可由使用程序经由过程一个挪用实行,并且同意用户声明变量、有前提实行和别的壮大的编程功效。
存储历程可包括程序流、逻辑和对数据库的查询。它们能够承受参数、输入参数、前往单个或多个了局集和前往值。

能够出于任何利用SQL语句的目标来利用存储历程,它具有以下长处:能够在单个存储过程当中实行一系列SQL语句。
能够从本人的存储历程内援用别的存储历程,这能够简化一系列庞大语句。
存储历程在创立时即在服务器长进行编译,以是实行起来比单个SQL语句快。
存储历程的功效取决于数据库所供应的功效。
创立存储历程
可以使用Transact-SQL语句CREATEPROCEDURE创立存储历程。创立存储历程前,请思索以下事项:不克不及将CREATEPROCEDURE语句与别的SQL语句组合到单个批处置中。
创立存储历程的权限默许属于数据库一切者,该一切者可将此权限授与其他用户。
存储历程是数据库工具,其称号必需恪守标识符划定规矩。
只能在以后数据库中创立存储历程。
创立存储历程时,应指定:一切输出参数和向挪用历程或批处置前往的输入参数。
实行数据库操纵(包含挪用别的历程)的编程语句。
前往至挪用历程或批处置以标明乐成或失利(和失利缘故原由)的形态值。体系存储历程
Microsoft®SQLServer™2000中的很多办理举动是经由过程一种称为体系存储历程的特别历程实行的。体系存储历程在master数据库中创立并存储,带有sp_前缀。可从任何数据库中实行体系存储历程,而无需利用master数据库称号来完整限制该存储历程的称号。

激烈倡议您不要创立以sp_为前缀的存储历程。SQLServer一直依照以下按次查找以sp_开首的存储历程:在master数据库中查找存储历程。
依据所供应的任何限制符(数据库称号或一切者)查找该存储历程。
假如未指定一切者,则利用dbo作为一切者查找该存储历程。
因而,固然以后数据库中大概存在带sp_前缀的用户创立的存储历程,但总会先反省master数据库(即便该存储历程已用数据库称号限制)。



主要假如用户创立的存储历程与体系存储历程同名,则永久不实行用户创立的存储历程。


分组
假如将一个分歧的标识号付与某历程,则能够用与现有某存储历程不异的称号创立该历程,如许可同意将这些历程举行逻辑分组。同名的分组历程能够同时删除。在统一使用程序中利用的历程一样平常都以该体例分组。比方,用于my_app使用程序的历程大概被定名为my_proc;1、my_proc;2等。删除my_proc即删除该全部组。将历程分组后,就没法删除该组内的单个历程。
一时存储历程
公用和全局一时存储历程与一时表相似,都能够用向该历程称号增加#和##前缀的办法举行创立。#暗示当地一时存储历程,##暗示全局一时存储历程。SQLServer封闭后,这些历程将不再存在。

一时存储历程在毗连到SQLServer的初期版本时很有效,这些初期版本不撑持再次利用Transact-SQL语句或批处置实行企图。毗连到SQLServer2000的使用程序应利用sp_executesql体系存储历程,而不利用一时存储历程。有关更多信息,请拜见实行企图的高速缓存和从头利用。

只要创立当地一时历程的毗连才干实行该历程,当该毗连封闭(用户从SQLServer中刊出)时,将主动删除该历程。

任何毗连都可实行全局一时存储历程。只要创立该历程的用户所用的毗连封闭,而且一切别的毗连所用的该历程确当前实行版本运转终了后,全局一时存储历程才不再存在。一旦用于创立该历程的毗连封闭,将不再同意启动实行该全局一时存储历程。只同意那些已启动实行该存储历程的毗连完成该历程的运转。

假如间接在tempdb数据库中创立没有#或##前缀的存储历程,则因为每次启动SQLServer时tempdb都要从头创立,因而当封闭SQLServer时将主动删除该存储历程。间接在tempdb中创立的历程即便在创立该历程的毗连停止后也会存在。与任何别的工具一样,可向其他用户授与、回绝和取销实行该一时存储历程的权限。
CREATEPROCEDURE
创立存储历程,存储历程是保留起来的能够承受和前往用户供应的参数的Transact-SQL语句的汇合。

能够创立一个历程供永世利用,或在一个会话中一时利用(部分一时历程),或在一切会话中一时利用(全局一时历程)。

也能够创立在Microsoft®SQLServer™启动时主动运转的存储历程。
语法
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,则SQLServer将空字符串注释为空字符串。有关更多信息,请拜见sp_dbcmptlevel。


取得有关存储历程的信息
若要显现用来创立历程的文本,请在历程地点的数据库中实行sp_helptext,并利用历程名作为参数。





申明利用ENCRYPTION选项创立的存储历程不克不及利用sp_helptext检察。



若要显现有关历程援用的工具的报表,请利用sp_depends。

若要为历程重定名,请利用sp_rename。
援用工具
SQLServer同意创立的存储历程援用尚不存在的工具。在创立时,只举行语法反省。实行时,假如高速缓存中还没有无效的企图,则编译存储历程以天生实行企图。只要在编译过程当中才剖析存储过程当中援用的一切工具。因而,假如语法准确的存储历程援用了不存在的工具,则仍能够乐成创立,但在运转时将失利,由于所援用的工具不存在。有关更多信息,请拜见提早称号剖析和编译。
提早称号剖析和兼容级别
SQLServer同意Transact-SQL存储历程在创立时援用不存在的表。这类才能称为提早称号剖析。不外,假如Transact-SQL存储历程援用了该存储过程当中界说的表,而兼容级别设置(经由过程实行sp_dbcmptlevel来设置)为65,则在创立时会收回告诫信息。而假如在运转时所援用的表不存在,将前往毛病信息。有关更多信息,请拜见sp_dbcmptlevel和提早称号剖析和编译。
实行存储历程
乐成实行CREATEPROCEDURE语句后,历程称号将存储在sysobjects体系表中,而CREATEPROCEDURE语句的文本将存储在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撑持两种一时历程:部分一时历程和全局一时历程。部分一时历程只能由创立该历程的毗连利用。全局一时历程则可由一切毗连利用。部分一时历程在以后会话停止时主动撤除。全局一时历程在利用该历程的最初一个会话停止时撤除。一般是在创立该历程的会话停止时。

一时历程用#和##定名,能够由任何用户创立。创立历程后,部分历程的一切者是独一可使用该历程的用户。实行部分一时历程的权限不克不及授与其他用户。假如创立了全局一时历程,则一切用户都可以会见该历程,权限不克不及显式取销。只要在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选项在存储历程实行过程当中无效,以后恢复为本来的设置。

假如其他用户要利用某个存储历程,那末在该存储历程外部,一些语句利用的工具名必需利用工具一切者的称号限制。这些语句包含:ALTERTABLE
CREATEINDEX
CREATETABLE
一切DBCC语句
DROPTABLE
DROPINDEX
TRUNCATETABLE
UPDATESTATISTICS权限
CREATEPROCEDURE的权限默许授与sysadmin流动服务器脚色成员和db_owner和db_ddladmin流动数据库脚色成员。sysadmin流动服务器脚色成员和db_owner流动数据库脚色成员能够将CREATEPROCEDURE权限让渡给其他用户。实行存储历程的权限授与历程的一切者,该一切者能够为别的数据库用户设置实行权限。
示例A.利用带有庞大SELECT语句的复杂历程
上面的存储历程从四个表的连接中前往一切作者(供应了姓名)、出书的书本和出书社。该存储历程不利用任何参数。

USEpubsIFEXISTS(SELECTnameFROMsysobjectsWHEREname=au_info_allANDtype=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_idGO

au_info_all存储历程能够经由过程以下办法实行:

EXECUTEau_info_all--OrEXECau_info_all

假如该历程是批处置中的第一条语句,则可以使用:

au_info_all
B.利用带有参数的复杂历程
上面的存储历程从四个表的连接中只前往指定的作者(供应了姓名)、出书的书本和出书社。该存储历程承受与传送的参数准确婚配的值。

USEpubsIFEXISTS(SELECTnameFROMsysobjectsWHEREname=au_infoANDtype=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=@lastnameGO

au_info存储历程能够经由过程以下办法实行:

EXECUTEau_infoDull,Ann--OrEXECUTEau_info@lastname=Dull,@firstname=Ann--OrEXECUTEau_info@firstname=Ann,@lastname=Dull--OrEXECau_infoDull,Ann--OrEXECau_info@lastname=Dull,@firstname=Ann--OrEXECau_info@firstname=Ann,@lastname=Dull

假如该历程是批处置中的第一条语句,则可以使用:

au_infoDull,Ann--Orau_info@lastname=Dull,@firstname=Ann--Orau_info@firstname=Ann,@lastname=Dull
C.利用带有通配符参数的复杂历程
上面的存储历程从四个表的连接中只前往指定的作者(供应了姓名)、出书的书本和出书社。该存储历程对传送的参数举行形式婚配,假如没有供应参数,则利用预设的默许值。

USEpubsIFEXISTS(SELECTnameFROMsysobjectsWHEREname=au_info2ANDtype=P)DROPPROCEDUREau_info2GOUSEpubsGOCREATEPROCEDUREau_info2@lastnamevarchar(30)=D%,@firstnamevarchar(18)=%ASSELECTau_lname,au_fname,title,pub_nameFROMauthorsaINNERJOINtitleauthortaONa.au_id=ta.au_idINNERJOINtitlestONt.title_id=ta.title_idINNERJOINpublisherspONt.pub_id=p.pub_idWHEREau_fnameLIKE@firstnameANDau_lnameLIKE@lastnameGO

au_info2存储历程能够用多种组合实行。上面只列出了部分组合:

EXECUTEau_info2--OrEXECUTEau_info2Wh%--OrEXECUTEau_info2@firstname=A%--OrEXECUTEau_info2[CK]ars[OE]n--OrEXECUTEau_info2Hunter,Sheryl--OrEXECUTEau_info2H%,S%
D.利用OUTPUT参数
OUTPUT参数同意内部历程、批处置或多条Transact-SQL语句会见在历程实行时代设置的某个值。上面的示例创立一个存储历程(titles_sum),并利用一个可选的输出参数和一个输入参数。

起首,创立历程:

USEpubsGOIFEXISTS(SELECTnameFROMsysobjectsWHEREname=titles_sumANDtype=P)DROPPROCEDUREtitles_sumGOUSEpubsGOCREATEPROCEDUREtitles_sum@@TITLEvarchar(40)=%,@@SUMmoneyOUTPUTASSELECTTitleName=titleFROMtitlesWHEREtitleLIKE@@TITLESELECT@@SUM=SUM(price)FROMtitlesWHEREtitleLIKE@@TITLEGO

接上去,将该OUTPUT参数用于把持流言语。





申明OUTPUT变量必需在创立表和利用该变量时都举行界说。



参数名和变量名纷歧定要婚配,不外数据范例和参数地位必需婚配(除非利用@@SUM=variable情势)。

DECLARE@@TOTALCOSTmoneyEXECUTEtitles_sumThe%,@@TOTALCOSTOUTPUTIF@@TOTALCOST<200BEGINPRINTPRINTAllofthesetitlescanbepurchasedforlessthan$200.ENDELSESELECTThetotalcostofthesetitlesis$+RTRIM(CAST(@@TOTALCOSTASvarchar(20)))

上面是了局集:

TitleName------------------------------------------------------------------------TheBusyExecutivesDatabaseGuideTheGourmetMicrowaveThePsychologyofComputerCooking(3row(s)affected)Warning,nullvalueeliminatedfromaggregate.Allofthesetitlescanbepurchasedforlessthan$200.
E.利用OUTPUT游标参数
OUTPUT游标参数用来将存储历程的部分游标传送回挪用批处置、存储历程或触发器。

起首,创立以下历程,在titles表上声明并翻开一个游标:

USEpubsIFEXISTS(SELECTnameFROMsysobjectsWHEREname=titles_cursorandtype=P)DROPPROCEDUREtitles_cursorGOCREATEPROCEDUREtitles_cursor@titles_cursorCURSORVARYINGOUTPUTASSET@titles_cursor=CURSORFORWARD_ONLYSTATICFORSELECT*FROMtitlesOPEN@titles_cursorGO

接上去,实行一个批处置,声明一个部分游标变量,实行上述历程以将游标赋值给部分变量,然后从该游标提取行。

USEpubsGODECLARE@MyCursorCURSOREXECtitles_cursor@titles_cursor=@MyCursorOUTPUTWHILE(@@FETCH_STATUS=0)BEGINFETCHNEXTFROM@MyCursorENDCLOSE@MyCursorDEALLOCATE@MyCursorGO
F.利用WITHRECOMPILE选项
假如为历程供应的参数不是典范的参数,而且新的实行企图不该高速缓存或存储在内存中,WITHRECOMPILE子句会很有匡助。

USEpubsIFEXISTS(SELECTnameFROMsysobjectsWHEREname=titles_by_authorANDtype=P)DROPPROCEDUREtitles_by_authorGOCREATEPROCEDUREtitles_by_author@@LNAME_PATTERNvarchar(30)=%WITHRECOMPILEASSELECTRTRIM(au_fname)++RTRIM(au_lname)ASAuthorsfullname,titleASTitleFROMauthorsaINNERJOINtitleauthortaONa.au_id=ta.au_idINNERJOINtitlestONta.title_id=t.title_idWHEREau_lnameLIKE@@LNAME_PATTERNGO
G.利用WITHENCRYPTION选项
WITHENCRYPTION子句对用户埋没存储历程的文本。下例创立加密历程,利用sp_helptext体系存储历程猎取关于加密历程的信息,然后实验间接从syscomments表中猎取关于该历程的信息。

IFEXISTS(SELECTnameFROMsysobjectsWHEREname=encrypt_thisANDtype=P)DROPPROCEDUREencrypt_thisGOUSEpubsGOCREATEPROCEDUREencrypt_thisWITHENCRYPTIONASSELECT*FROMauthorsGOEXECsp_helptextencrypt_this

上面是了局集:

Theobjectscommentshavebeenencrypted.

接上去,选择加密存储历程内容的标识号和文本。

SELECTc.id,c.textFROMsyscommentscINNERJOINsysobjectsoONc.id=o.idWHEREo.name=encrypt_this

上面是了局集:





申明text列的输入显现在独自一行中。实行时,该信息将与id列信息呈现在统一行中。



idtext----------------------------------------------------------------------1413580074?????????????????????????????????e?????????????????????????????????????????(1row(s)affected)
H.创立用户界说的体系存储历程
上面的示例创立一个历程,显现表名以emp开首的一切表及其对应的索引。假如没有指定参数,该历程将前往表名以sys开首的一切表(及索引)。

IFEXISTS(SELECTnameFROMsysobjectsWHEREname=sp_showindexesANDtype=P)DROPPROCEDUREsp_showindexesGOUSEmasterGOCREATEPROCEDUREsp_showindexes@@TABLEvarchar(30)=sys%ASSELECTo.nameASTABLE_NAME,i.nameASINDEX_NAME,indidASINDEX_IDFROMsysindexesiINNERJOINsysobjectsoONo.id=i.idWHEREo.nameLIKE@@TABLEGOUSEpubsEXECsp_showindexesemp%GO

上面是了局集:

TABLE_NAMEINDEX_NAMEINDEX_ID------------------------------------------------employeeemployee_ind1employeePK_emp_id2(2row(s)affected)
I.利用提早称号剖析
上面的示例显现四个历程和提早称号剖析的各类大概利用体例。只管援用的表或列在编译时不存在,但每一个存储历程都可创立。

IFEXISTS(SELECTnameFROMsysobjectsWHEREname=proc1ANDtype=P)DROPPROCEDUREproc1GO--Creatingaprocedureonanonexistenttable.USEpubsGOCREATEPROCEDUREproc1ASSELECT*FROMdoes_not_existGO--Hereisthestatementtoactuallyseethetextoftheprocedure.SELECTo.id,c.textFROMsysobjectsoINNERJOINsyscommentscONo.id=c.idWHEREo.type=PANDo.name=proc1GOUSEmasterGOIFEXISTS(SELECTnameFROMsysobjectsWHEREname=proc2ANDtype=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=Pando.name=proc2转自:http://goaler.xicp.net/ShowLog.asp?ID=515

先说DDL的分类。有一类DDL,是不需要重建表的,比如加非聚簇索引。这类操作其实不会丢数据,也是在原表上直接操作,对于我们“以恢复数据为目的”的闪回,是可以先忽略的。另外一类,则是会影响到表数据的操作。
小妖女 该用户已被删除
沙发
发表于 2015-1-19 21:07:39 | 只看该作者
很多书籍啊,不过个人认为看书太慢,还不如自己学。多做实际的东西,就会遇到很多问题,网上搜下解决问题。不断重复这个过程,在配合sql的F1功能。
透明 该用户已被删除
板凳
发表于 2015-1-28 05:54:37 | 只看该作者
原来的计算字段其实和虚拟字段很像。只是管理方面好了而已,性能方面提高不多。但是SQL2005提供了计算字段的持久化,这就提高了查询的性能,但是会加重insert和update的负担。OLTP慎用。OLAP可以大规模使用。
只想知道 该用户已被删除
地板
发表于 2015-2-5 14:01:09 | 只看该作者
原来公司用过MYSQL自己也只是建个表写个SQL
分手快乐 该用户已被删除
5#
发表于 2015-2-11 23:54:33 | 只看该作者
是否碎片会引发效率问题?这都是需要进一步探讨的东西。varbinary(max)代替image也让SQLServer的字段类型更加简洁统一。
蒙在股里 该用户已被删除
6#
发表于 2015-3-2 20:22:59 | 只看该作者
很多书籍啊,不过个人认为看书太慢,还不如自己学。多做实际的东西,就会遇到很多问题,网上搜下解决问题。不断重复这个过程,在配合sql的F1功能。
灵魂腐蚀 该用户已被删除
7#
发表于 2015-3-11 06:06:57 | 只看该作者
其中最有名的应该是row_number了。这个终于解决了用临时表生成序列号的历史,而且SQLServer2005的row_number比Oracle的更先进。因为它把Orderby集成到了一起,不用像Oracle那样还要用子查询进行封装。
乐观 该用户已被删除
8#
发表于 2015-3-17 22:09:16 | 只看该作者
多加的系统视图和实时系统信息这些东西对DBA挑优非常有帮助,但是感觉粒度还是不太细。
爱飞 该用户已被删除
9#
发表于 2015-3-25 03:43:41 | 只看该作者
索引视图2k就有。但是2005对其效率作了一些改进但是schema.viewname的作用域真是太限制了它的应用面。还有一大堆的环境参数和种种限制都让人对它有点却步。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-5-3 17:47

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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