关于sqlsever的系统存储过程

存储过程分为三类:系统存储过程:(SystemstoredProcedure)以sp_开头,是SQLSERVER内置的存储过程。
扩展存储过程:(ExtendedstoredProcedure),它是一种插件程序,用于扩展SQLSERVER的功能,以sp_或xp_开头,以DLL的形式单独存在。
(系统存储过程和扩展存储过程都驻留在master数据库中。
以sp_开头的过程是全局的,可以直接从任何数据库调用。
)系统存储过程主要分为以下几类:目录存储过程,例如:sp_columns返回当前环境下可查询的指定表或视图的列信息。
sp_tables返回当前环境中可以查询的对象列表(可以出现在FROM子句中的任何对象)。
sp_stored_procedures返回当前环境中的存储过程列表。
复制该类的存储过程,例如:sp_addarticle以创建文章并将其添加到发布中。
该存储过程在发布服务器的发布数据库上执行。
安全管理存储过程,例如:sp_addole在当前数据库中创建新的MicrosoftSQLServer角色。
sp_password添加或更改MicrosoftSQLServer登录密码。
分布式查询存储过程,例如:sp_foreignkeys返回引用链接服务器中表上的主键的外键。
sp_primarykeys返回指定远程表的主键列,每个键列占用一行。
扩展存储过程:xp_sendmail将电子邮件和查询结果集附件发送给特定收件人。
xp_startmail启动SQL邮件客户端会话。
xp_cmdshell以操作系统命令行解释器的形式执行给定的命令字符串,并将任何输出作为一行文本返回。
授予非管理用户执行xp_cmdshell的权限。
用户定义存储过程:(User-definestoredProcedure),这是用户在特定数据库中定义的,名称最好不要以sp_和xp_开头,以免混淆。
注意事项:1、在存储过程中,不能使用一些创建对象的语句:createfault、createtrigger、createprocedure、createview、createrule。
2.在同一个数据库中,不同的所有者可以创建具有相同名称的对象。
例如:三个数据表a.sample、b.sample、c.sample可以同时存在。
如果存储过程中没有指定对象的所有者(例如存储过程中的select*from示例语句,这句话中的示例没有指定所有者),则执行时默认的所有者搜索顺序为:匹配存储的创建者过程->匹配数据库所有者。
如果在此搜索过程中未指定所有者,系统将报告错误。
(这里额外补充一句:如果需要严格的数据操作,请尝试在任何操作中添加所有者,例如leijun.sample)3.在存储过程名称和创建的存储前面添加#或##procedure是“过程临时存储”(#是本地临时存储过程,##是全局临时存储过程)。

sqlserver怎么创建存储过程

什么是存储过程?q存储过程(过程)类似于C语言函数。
q用于执行管理任务或应用复杂的业务规则。
存储过程可以接受参数并返回结果。
存储过程可以包含数据操作语句、变量和逻辑控制语句。
等待存储过程的优点(1)执行速度高。
存储过程在创建时就已经经过语法检查和性能优化,不需要每次运行时都进行编译。
存储在数据库服务器上,性能较高。
(2)提供模块化设计。
您只需创建一次存储过程并将其存储在数据库中,以后您可以在程序中根据需要多次调用该过程。
存储过程可以由具有数据库编程经验的人员创建,并且可以独立于程序的源代码进行修改。
(3)提高系统安全性。
存储过程可以作为用户访问数据的通道。
您可以限制用户对数据表的访问,创建特定的存储过程供用户使用,并提供对数据的完全访问权限。
可以对存储过程定义的文本进行加密,以防止用户查看其内容。
(4)减少网络流量。
需要数百行Transact-SQL代码的操作可以通过执行过程代码的单个语句来实现,而无需通过网络发送数百行代码。
存储过程的分类q系统存储过程q由系统定义,存储在主数据库中q与C中的系统函数类似q所有系统存储过程名称都以“sp_”或“xp_”开头q用户定义的存储过程q存储procedureq由用户在自己的数据库中创建,类似于C中的用户定义函数。
常用的系统存储过程。
系统存储过程描述:sp_databases列出了所有数据库服务器。
sp_helpdb报告有关指定数据库或所有数据库的信息sp_renamedb更改数据库名称sp_tables返回当前环境中可查询的对象列表sp_columns返回有关表列的信息sp_help查看有关表的所有信息sp_helpconstraint查看某个表的约束tablesp_helpindex查看表的索引sp_stored_procedures列出当前环境中的所有存储过程。
sp_password添加或更改帐户的密码。
sp_helptext显示默认值、未加密存储过程、自定义存储过程、触发器或视图的实际文本。
EXECsp_databases/*列出当前系统上的数据库*/EXECsp_renamedb'Northwind','Northwind1'/*更改数据库名称(对于单用户访问,最简单的方法是在执行SQL语句时禁用EnterpriseManager)*/USEstuDBGOEXECsp_tables/*List当前数据库中请求的对象*/EXECsp_columnsstuInfo/*返回具体表列信息*/EXECsp_helpstuInfo/*查看stuInfo表信息*/EXECsp_helpconstraintstuInfo/*查看stuInfo表限制*/EXECsp_helpindexstuMarks/*查看stuMarks表索引*/EXECsp_helptext'view_stuInfo_stuMarks'/*查看语句文本*/EXECsp_stored_procedures/*查看当前数据库中的存储过程*/常用扩展存储过程q常用扩展存储过程:xp_cmdshellq可以使用DOS命令执行一些操作q将任何输出作为文本字符串返回q调用语法:qEXECxp_cmdshellDOS命令[NO_OUTPUT]USEmasterGOEXECxp_cmdshell'mkdird:/bank',NO_OUTPUT/*创建文件夹D:/bank*/IFEXISTS(SELECT*FROMsysdatabasesWHEREname='bankDB')DROPDATABASEbankDBGOCREATEDATABASEbankDB(...)GOEXECxp_cmdshell'dirD:/bank/'--查看文件/*查看文件夹D:/bank*/如何创建存储过程?q存储过程定义语法CREATEPROC[EDURE]存储过程名称@参数1数据类型=默认值,...,@参数n数据类型OUTPUTASSQLGOq语句类似于C语言函数,参数可选q参数分为输入参数、输出参数q参数和输入参数可以有默认值。
创建不带参数的存储过程CREATEPROCEDUREproc_stu/*proc_stu-存储过程的名称*/ASDECLARE@writingAvgfloat,@labAvgfloat/*平均分数笔试和机考平均分变量*/SELECT@writingAvg=AVG(writeExam),@labAvg=AVG(labExam)FROMstuMarksprint'笔试平均分:'+convert(varchar(5),@writingAvg)printt'Average电脑成绩test:'+convert(varchar(5),@labAvg)IF(@writingAvg>70AND@labAvg>70)print'本班考试成绩:优秀'/*显示考试成绩分数*/ELSEprint'考试成功本课程:不良“密封”---------------------------------------------------------------'打印'未通过此题的学生exam:'SELECTstuName,stuInfo.stuNo,writingExam,labExam/*显示未通过本次考试的学生*/FROMstuInfoINNERJOINstuMarksONstuInfo.stuNo=stuMarks.stuNoWHEREwriterExam<60ORlabExam>要调用存储过程,请使用EXECUTE语句。
q调用EXEC过程的语法。
名称[参数]创建带参数的存储过程。
q存储过程参数分为两种类型:q输入参数。
q输出参数。
qInput参数:用于向存储过程传递值,类似于C中的按值传递。
输出参数q:用于调用存储过程后返回结果,类似于C中通过输入参数引用传递存储过程的问题:修改上面的例子:由于每次考试的难度不同,所以每次都通过;笔试和机考成绩随时可能发生变化(60分以上),考试成绩也会相应变化。
分析:在上述存储过程中添加2个输入参数:@writingPass笔试通行字符串@labPass计算机测试通行字符串CREATEPROCEDUREproc_stu@writingPassint=60,/*输入参数:笔试通行字符串*/@labPassint=60/*输入参数:电脑测试合格线*/ASprint'--------------------------------------------------'打印'不及格的学生passthisexam:'SELECTstuName,stuInfo.stuNo,writerExam,/*查询考试不及格的学生*/labExamFROMstuInfoINNERJOINstuMarksONstuInfo.stuNo=stuMarks.stuNoWHEREwriteExam<@writingPassORlabExam<@labPassGOq调用带参数的存储过程。
计算机考试假设难度较大,计算机考试及格分数定为55分,计算机考试及格分数定为55分,计算机考试及格分数定为55分,计算机考试及格分数定为55分。
机考55分。
笔试55分。
60分EXECproc_stu60.55-或者像这样调用:EXECproc_stu@labPass=55,@writingPass=60带输出参数的存储过程q如果调用存储过程后想返回一个或多个值,则需要使用Output参数问题(输出):修改上面的示例以返回未通过考试的学生人数。
CREATEPROCEDUREproc_stu@notpassSumintOUTPUT,/*输出(返回)参数:表示测试失败的人数*/@writingPassint=60,/*建议把默认参数放在最后*/@labPassint=60AS...SELECTstuName,stuInfo.stuNo,writerExam,/*统计并显示学生人数,不谁通过了考试*/labExamFROMstuInfoINNERJOINstuMarksONstuInfo.stuNo=stuMarks.stuNoWHEREwritingExam<@writingPassORlabExam<@labPassSELECT@notpassSum=COUNT(stuNo)FROMstuMarksWHEREwriteExam<@writerPassORlabExam<@labPassGOq调用存储过程带输出参数/*---调用存储过程----*/DECLARE@sumint/*调用时必须使用OUTPUT关键字,返回结果会存储在变量@sum*/EXECproc_stu@sumOUTPUT中,64print'-------------------------------------------------------------------'IF@sum>=3/*后面的引号返回结果*/print'Count未通过的人数:'+convert(varchar(5),@sum)+'人,超过60%,应降低及格分数'ELSEprint'未通过的人数:'+convert(varchar(5),@sum)+',控制在60%以下,及格分数为平均'注意:调用时还需要尊重OUTPUT关键字,否则SQLServer会将其视为输入范围。
在处理存储过程中的错误时,可以使用PRINT语句来显示错误信息,但该信息是临时的,只能显示给RAISERROR用户。
显示有关用户定义错误的信息时,您可以指定严重性级别。
@@ERROR系统变量记录所有。
qRAISERROR语句的使用,如发生的错误,如下:RAISERROR(msg_id|msg_str,severity,stateWITHoption[,...n]])•msg_id:指定sysmessages系统表中用户定义的错误信息。
•msg_str:用户定义的具体信息,最多255个字符。
•severity:确定严重性级别。

用户可用级别为0到18。
•状态:指示错误的状态,值为1到127。
•选项:指示是否应将错误写入服务器错误日志。
有关RAISERROR运算符的每个参数的详细说明,请参阅SQL帮助!问题:改进上面的例子。
当用户调用存储过程并且传递的参数不在0到100范围内时,将出现错误警告并且存储过程将停止执行。
CREATEPROCEDUREproc_stu@notpassSumintOUTPUT,--输出参数@writingPassint=60,--默认参数放在@labPassint=60后面--默认参数放在ASIF后面(NOT@writingPassBETWEEN0AND100)OR(NOT@labPassBETWEEN0AND100)/*调用系统错误,指定错误严重级别16,调用状态为1(默认)并更改系统变量@@ERROR*/BEGINRAISERROR('行通过错误,提供从0到100的分数,退出统计中断',16,1)RETURN---立即return,退出存储过程END...其余语句与上例相同,不加GO/*---调用存储过程程序,操作员检查RAISERROR----*/DECLARE@sumint,@tintEXECproc_stu@sumOUTPUT,604/*笔试成绩不正确。
输入604点*/SET@t=@@ERRORprint'错误号:'+convert(varchar(5),@t)IF@t<>0/*如果执行RAISERROR,则全局系统值@@ERROR不会为0,表示错误*/RETURN--批处理退出,后续指令将不再通过print'------执行。
----------------------------------------------------'IF@sum>=3print'未通过人数:'+convert(varchar(5),@sum)+'人,超过60%,通过分数应降低。
'ELSEprint'失败人数:'+convert(varchar(5),@sum)+'人,通过率控制在60%以下。
线条适中。
GOGO好吧,让我们开始吧。
简要说明:•存储过程是一组预编译的SQL语句,可能包含数据操作语句、变量、逻辑控制语句等。
•存储过程允许接受参数,参数分为:–输入参数–输出参数其中它们的输入参数可以有默认值。
•输入参数:调用时可以将参数传递给存储过程。
此类参数可用于将值传递给存储过程。
•输出参数从存储过程返回(输出)值,后跟OUTPUT关键字。
•RAISERROR语句用于将值传递给存储过程。
用户报告了一个错误。