SQLSERVER存储过程大总结
- 格式:doc
- 大小:62.00 KB
- 文档页数:16
SQLServer 存储过程返回值总结1. 存储过程没有返回值的情况 (即存储过程语句中没有 return 之类的语句用方法 int count = ExecuteNonQuery(..执行存储过程其返回值只有两种情况(1假如通过查询分析器执行该存储过程,在显示栏中假如有影响的行数,则影响几行 count 就是几(2假如通过查询分析器执行该存储过程, 在显示栏中假如显示 ' 命令已成功完成。
' 则 count = -1;在显示栏中假如有查询结果,则 count = -1总结:A.ExecuteNonQuery(该方法只返回影响的行数,假如没有影响行数,则该方法的返回值只能是 -1,不会为 0。
B.不论 ExecuteNonQuery(方法是按照CommandType.StoredProcedure 或者 CommandType.Text 执行, 其效果和 A 一样。
---------------------------------------------------------------------------------------------------------------------------------------------------2. 获得存储过程的返回值 --通过查询分析器获得(1不带任何参数的存储过程 (存储过程语句中含有 return---创建存储过程CREATE PROCEDURE testReturnASreturn 145GO---执行存储过程DECLARE @RC intexec @RC=testReturnselect @RC---说明查询结果为 145(2带输入参数的存储过程 (存储过程语句中含有 return ---创建存储过程create procedure sp_add_table1@in_name varchar(100,@in_addr varchar(100,@in_tel varchar(100asif(@in_name = '' or @in_name is nullreturn 1elsebegininsert into table1(name,addr,telvalues(@in_name,@in_addr,@in_telreturn 0end---执行存储过程<1>执行下列,返回 1declare @count int exec @count = sp_add_table1 '','中三路 ','123456' select @count <2>执行下列,返回 0declare @count int exec @count = sp_add_table1 '','中三路 ','123456' select @count ---说明查询结果不是 0就是 1(3带输出参数的存储过程 (存储过程中可以有 return 可以没有 return例子 A :---创建存储过程create procedure sp_output@output int outputasset @output = 121return 1---执行存储过程<1>执行下列,返回 121declare @out intexec sp_output @out outputselect @out<2>执行下列,返回 1declare @out intdeclare @count intexec @count = sp_output @out outputselect @count---说明有 return ,只要查询输出参数,则查询结果为输出参数在存储过程中最后变成的值;只要不查询输出参数,则查询结果为 return 返回的值例子 B :---创建存储过程create procedure sp_output@output int outputasset @output = 121---执行存储过程<1>执行下列,返回 121declare @out intexec sp_output @out outputselect @out<2>执行下列,返回 0declare @out intdeclare @count intexec @count = sp_output @out outputselect @count---说明没有 return ,只要查询输出参数,则查询结果为输出参数在存储过程中最后变成的值;只要不查询输出参数,则查询结果为 0总结:(1存储过程共分为 3类:A. 返回记录集的存储过程 ---------------------------其执行结果是一个记录集,例如:从数据库中检索出符合某一个或几个条件的记录B. 返回数值的存储过程 (也可以称为标量存储过程 -----其执行完以后返回一个值,例如:在数据库中执行一个有返回值的函数或命令C. 行为存储过程 -----------------------------------用来实现数据库的某个功能,而没有返回值,例如:在数据库中的更新和删除操作(2含有 return 的存储过程其返回值为 return 返回的那个值(3没有 return 的存储过程,不论执行结果有无记录集,其返回值是 0(4带输出参数的存储过程:假如有 return 则返回 return 返回的那个值,假如要select 输出参数,则出现输出参数的值,于有无 return 无关---------------------------------------------------------------------------------------------------------------------------------------------------3. 获得存储过程的返回值 --通过程序获得---------------------------------------------------------------------------------------------------------------------------------------------------SqlParameter[] cmdParms = { .. ,newSqlParameter("@return",SqlDbType.Int};cmdParms[cmdParms.Length - 1].Direction = ParameterDirection.ReturnValue; 或者cmdParms[cmdParms.Length - 1].Direction = ParameterDirection.Output或者cmdParms[cmdParms.Length - 1].Direction = ParameterDirection.Input; 得到返回值 object bj = cmdParms[cmdParms.Length - 1].Value;。
SQL Server存储过程实例详解一、背景介绍存储过程是S QL Se rv e r中一种非常重要的数据库对象,它是一组预编译的SQ L语句集合,可以被存储在数据库中并被反复调用。
本文将详细介绍SQ LS er ve r存储过程的概念、用途以及如何创建和调用存储过程。
二、概念解析1.什么是存储过程?存储过程是一组S QL语句的集合,经过编译并存储在数据库中,以便被反复执行和调用。
它可以接受参数,并且可以返回结果集。
2.存储过程的优势有哪些?-提高数据库性能:存储过程可以预编译,加快SQ L语句的执行速度。
-提高数据安全性:将敏感的数据库操作封装在存储过程中,只对外暴露存储过程的接口,提高数据的安全性。
-提高开发效率:存储过程可以被反复调用,在多个应用程序中共享和复用。
3.存储过程的语法结构存储过程的语法结构如下所示:C R EA TE PR OC ED UR Epr o ce du re_n am e[@pa ra me te r1da tat y pe[=de fa ul t_val u e][O UT|O UT PU T]][@pa ra me te r2da tat y pe[=de fa ul t_val u e][O UT|O UT PU T]]...A SB E GI N--存储过程的执行逻辑E N D三、创建存储过程在SQ LS er ve r中,创建存储过程需要使用`CR EA TE P RO CED U RE`语句,下面是一个创建存储过程的示例:C R EA TE PR OC ED UR EGe t Em pl oy ee Co un tA SB E GI NS E LE CT CO UN T(*)ASE m pl oy ee Co un tF R OM Em pl oy ee sE N D四、调用存储过程调用存储过程可以使用`EX EC UT E`语句或者直接使用存储过程名称,下面是两种调用存储过程的示例:1.使用`E XE CU TE`语句调用存储过程:E X EC UT EG et Em pl oye e Co un t2.直接使用存储过程名称调用存储过程:G e tE mp lo ye eC ou nt五、存储过程参数存储过程可以接受输入参数和输出参数,下面是一个接受输入参数的存储过程示例:C R EA TE PR OC ED UR EGe t Em pl oy ee By Na me@n am eN VA RC HA R(50)A SB E GI NS E LE CT*F R OM Em pl oy ee sW H ER EE mp lo ye eN ame=@n am eE N D调用带有输入参数的存储过程时,需要传入参数的值,示例代码如下:E X EC UT EG et Em pl oye e By Na me@n am e='Jo h nS mi th'六、控制流程和逻辑处理存储过程可以包含控制流程和逻辑处理,例如条件判断、循环和异常处理,下面是一个带有I F条件判断的存储过程示例:C R EA TE PR OC ED UR EGe t Em pl oy ee By Sa lar y@s al ar yF LO ATA SB E GI NI F@s al ar y>5000B E GI NS E LE CT*F R OM Em pl oy ee sW H ER ES al ar y>@s ala r yE N DE L SEB E GI NS E LE CT*F R OM Em pl oy ee sW H ER ES al ar y<=@sal a ryE N DE N D七、常见问题和注意事项1.存储过程应该经过充分的测试和性能优化,以确保其高效运行。
SQLServer系统存储过程和参数⽰例。
⼀些⽤在SQL 2000的企业管理GUI中,并且不打算⽤于其他的流程。
微软已预计将其中的⼀些存储过程从未来的SQL Server版本中删除(或已经删除了)。
虽然这些存储过程可能很有⽤并为你节省了很多时间,但是他们可以在任何时候改变他们的函数或简单的删除掉。
下⾯的图表显⽰了当许多存储过程从⼀个Microsoft SQL Server版本移⼊另⼀个版本时,引⼊了新的存储过程,⽽原来的⼀些则从安装包⾥删除了。
⼤多数的存储过程,如果不是所有的,要求⽤户是系统管理员服务器⾓⾊以便执⾏这些存储过程。
和⽂件系统交互的存储过程还要求执⾏存储过程的⽤户(还有SQL Server的服务帐户)具有访问⽂件/⽂件夹的权限。
存储过程名称SQL 2000SQL 2005SQL 2008sp_executeresultset Xsp_MSforeachdb X X Xsp_MSforeachtable X X Xsp_readerrorlog X X Xxp_create_subdir X XXp_delete_file X Xxp_dirtree X X Xxp_fileexist X X Xxp_fixeddrives X X Xxp_getfiledetails Xxp_getnetname X X Xxp_loginconfig X X Xxp_makecab Xxp_msver X X Xxp_get_mapi_profiles X X Xxp_subdirs X X Xxp_test_mapi_profile X X Xxp_unpackcab X sp_executeresultset 微软在SQL Server 2005中删除了这个名为sp_executeresultset的便利⼩程序。
它允许你在空闲时通过使⽤SELECT查询产⽣动态SQL代码。
然后,作为结果的SQL命令将会在数据库上执⾏。
SQL Server数据库:存储过程学习总结一、SQL Server生成唯一值的方法NEWID() -- SQL Server中生成唯一序列值的函数。
SYS_GUID() --Oracle中生成唯一序列值的函数。
二、事务的应用TransactionSQL Server中的Transaction,需显示开启,提交/回滚,且一个Transaction必须要有Commit Transaction/Rollback Transaction。
且Commit/Rollback一定要在return之前。
在存储过程中试用Transaction的示例:IF EXISTS(SELECT*FROM SYSOBJECTS WHERE name='my_sp_test'AND TYPE='P')BEGIN DROP PROCEDURE my_sp_test;END;GOcreate procedure my_sp_test @i int, @outstr varchar(100)out asbegin trybegin transaction-- 事务开启declare @j int;if @i<10 beginset @outstr ='直接Return,并未Commit或Rollback Transaction.';return;endelse beginset @outstr ='抛出自定义异常,并在异常捕获处Rollback Transaction.';RAISERROR (66666,-- Message id.16,-- Severity,1 -- State,);end;commit transaction;-- 提交事务end trybegin catchif@@ERROR=66666 begin-- 判断是否存在开启的事务,避免如果事务在这之前已提交或者已回滚,再次回滚会抛异常if(@@TRANCOUNT<> 0)beginrollback transaction;-- 事务回滚end;end;return;end catch;go测试存储过程,如下代码:/* 第一个入参= 12,不会产生异常*/DECLARE @OUTSTR_test V ARCHAR(100);exec dbo.my_sp_test12,@OUTSTR_test outprint @OUTSTR_test ;-- @OUTSTR_test = '抛出自定义异常,并在异常捕获处Rollback Transaction.'/* 第一个入参= 8,执行后则会出现异常,异常信息如下行* 'EXECUTE 后的事务计数指示BEGIN 和COMMIT 语句的数目不匹配。
SQLServer存储过程详解SQL Server存储过程是预编译的一组SQL语句和逻辑,可被用来执行复杂的数据操作和业务逻辑。
存储过程在数据库中存储并可以被多个应用程序或用户调用。
下面将详细介绍SQL Server存储过程的概念、创建、使用和优点。
概念:存储过程是一种即存即用的动态SQL语句集合。
它可以完成数据库事务、数据运算和获取结果等操作。
存储过程可以接收输入参数,并返回输出参数和结果集。
存储过程的主要目的是提高性能、减少网络通信,以及重用SQL语句。
创建:使用CREATEPROCEDURE语句可以创建存储过程。
创建存储过程的语法如下:CREATE PROCEDURE procedure_nameASSQL statements例如,下面是一个创建带有输入参数的存储过程的示例:CREATE PROCEDURE GetEmployeeAS使用:使用存储过程可以通过EXECUTE或者EXEC语句调用。
例如,下面是通过执行存储过程来调用的示例:或者存储过程可以传递参数,并返回结果集或输出参数。
执行存储过程时,传递的参数可以是常量值,也可以是变量。
优点:1.提高性能:存储过程将预编译的SQL语句保存在数据库中,可以减少解析器的工作量,提高了查询的执行速度。
此外,存储过程还可以减少网络通信,降低了网络带宽的压力。
2.重用SQL语句:存储过程可以在多个应用程序或用户之间共享和重用。
这样可以避免编写重复的代码,并降低维护成本。
3.安全性:通过存储过程,可以限制对数据库的直接访问,并只允许通过存储过程来完成数据操作。
这提高了数据的安全性,避免了对数据库的滥用。
4.事务处理:存储过程可以包含事务处理逻辑,可以确保数据库操作的原子性,保证数据的一致性和完整性。
在存储过程中执行的一系列语句要么全部执行成功,要么全部回滚。
5.提高代码可读性:存储过程将一系列SQL语句封装在一起,提高了代码的可读性。
存储过程可以通过名称来描述其目的,使得代码更易于理解和维护。
SqlServer存储过程详解SqlServer存储过程详解1.创建存储过程的基本语法模板:if (exists (select*from sys.objects where name ='pro_name'))drop proc pro_namegocreate proc pro_name@param_name param_type [=default_value]asbeginsql语句endps:[]表⽰⾮必写内容。
sys.objects存储的是本数据库中的信息,不仅仅存储表名,还有存储过程名、视图名、触发器等等。
例如:1if (exists (select*from sys.objects where name ='USP_GetAllUser'))2drop proc USP_GetAllUser3go4create proc USP_GetAllUser5@UserId int=16as7set nocount on;8begin9select*from UserInfo where Id=@UserId10endps:SQL Server 实⽤⼯具将 GO 解释为应将当前的 Transact-SQL 批处理语句发送给 SQL Server 的信号。
当前批处理语句是⾃上⼀ GO 命令后输⼊的所有语句,若是第⼀条 GO 命令,则是从特殊会话或脚本的开始处到这条 GO 命令之间的所有语句。
2.调⽤⽅法:exec P_GetAllUser 2;ps:⼀般在执⾏存储过程是,最好加上架构名称,例如 P_GetAllUser 这样可以可以减少不必要的系统开销,提⾼性能。
因为如果在存储过程名称前⾯没有加上架构名称,SQL SERVER ⾸先会从当前数据库sys schema(系统架构)开始查找,如果没有找到,则会去其它schema查找,最后在dbo架构(系统管理员架构)⾥⾯查找。
SQLServer执⾏存储过程⼀.不含参数的存储过程1.没有返回值:创建语句:CREATE PROCEDURE dbo.ProTestASDECLARE @test intSET @test = 1Go执⾏SQL语句:EXEC dbo.ProTest消息:命令已成功完成。
结果:⽆2.有返回值(使⽤select):创建语句:CREATE PROCEDURE dbo.ProTestASDECLARE @test INT;SET @test = 123;SELECT @test;GO执⾏SQL语句:EXEC dbo.ProTest消息:(1 ⾏受影响)。
结果:123(表结构形式)3.有返回值(使⽤return)创建语句:CREATE PROCEDURE dbo.ProTestASDECLARE @test INT;SET @test = 123;RETURN @test;GO执⾏SQL语句:DECLARE @test INT;EXEC @test = dbo.ProTest;SELECT @test消息:(1 ⾏受影响)。
结果:123(表结构形式)4.查询⼀个或多个集合(类似执⾏select)创建语句:CREATE PROCEDURE dbo.ProTestASSELECT *FROM dbo.Material_SO_PipeOrder;GO执⾏SQL语句:EXEC dbo.ProTest消息:查询出来的条数结果:查询结果⼆.含参数的存储过程1.没有返回值创建语句:CREATE PROCEDURE dbo.ProTest@OrderNO NVARCHAR(50) ,@OrderName NVARCHAR(50) ,@RMDSC NVARCHAR(500) = NULL --表⽰可为空参数ASIF ( @OrderNO IS NOT NULL )BEGININSERT INTO dbo.Material_SO_PipeOrder( ID, OrderNO, OrderName, RMDSC )VALUES ( NEWID(), -- ID - uniqueidentifier@OrderNO, -- OrderNO - nvarchar(50)@OrderName, -- OrderName - nvarchar(50)@RMDSC -- RMDSC - nvarchar(500));END;GO执⾏SQL语句:EXEC dbo.ProTest @OrderNO = N'单号001', @OrderName = N'名称001', @RMDSC = N'备注'(或不写列名"EXEC dbo.ProTest N'单号001', N'名称001', N'备注';",但不能混合使⽤,下同)消息:(1 ⾏受影响)。
SQLserver存储过程:数据的插⼊和更新存储过程的功能⾮常强⼤,在某种程度上甚⾄可以替代业务逻辑层,接下来就⼀个⼩例⼦来说明,⽤存储过程插⼊或更新语句。
1、数据库表结构所⽤数据库为Sql Server2008。
2、创建存储过程(1)实现功能:1)有相同的数据,直接返回(返回值:0); 2)有主键相同,但是数据不同的数据,进⾏更新处理(返回值:2); 3)没有数据,进⾏插⼊数据处理(返回值:1)。
根据不同的情况设置存储过程的返回值,调⽤存储过程的时候,根据不同的返回值,进⾏相关的处理。
(2)下⾯编码只是实现的基本的功能,具体的Sql代码如下:1 Create proc sp_Insert_Student2 @No char(10),3 @Name varchar(20),4 @Sex char(2),5 @Age int,6 @rtn int output7 as8 declare9 @tmpName varchar(20),10 @tmpSex char(2),11 @tmpAge int1213 if exists(select * from Student where No=@No)14 begin15 select @tmpName=Name,@tmpSex=Sex,@tmpAge=Age from Student where No=@No16 if ((@tmpName=@Name) and (@tmpSex=@Sex) and (@tmpAge=@Age))17 begin18 set @rtn=0 --有相同的数据,直接返回值19 end20 else21 begin22 update Student set Name=@Name,Sex=@Sex,Age=@Age where No=@No23 set @rtn=2 --有主键相同的数据,进⾏更新处理24 end25 end26 else27 begin28 insert into Student values(@No,@Name,@Sex,@Age)29 set @rtn=1 --没有相同的数据,进⾏插⼊处理30 end3、调⽤存储过程这⾥在Sql Server环境中简单的实现了调⽤,在程序中调⽤也很⽅便。
SQL Server存储过程返回值总结1. 存储过程没有返回值的情况(即存储过程语句中没有return之类的语句)用方法int count = ExecuteNonQuery(..)执行存储过程其返回值只有两种情况(1)假如通过查询分析器执行该存储过程,在显示栏中假如有影响的行数,则影响几行count 就是几(2)假如通过查询分析器执行该存储过程,在显示栏中假如显示'命令已成功完成。
'则count = -1;在显示栏中假如有查询结果,则count = -1总结:A.ExecuteNonQuery()该方法只返回影响的行数,假如没有影响行数,则该方法的返回值只能是-1,不会为0。
B.不论ExecuteNonQuery()方法是按照CommandType.StoredProcedure或者CommandType.Text执行,其效果和A一样。
2. 获得存储过程的返回值--通过查询分析器获得(1)不带任何参数的存储过程(存储过程语句中含有return)---创建存储过程CREATE PROCEDURE testReturnASreturn 145GO---执行存储过程DECLARE @RC intexec @RC=testReturnselect @RC---说明查询结果为145(2)带输入参数的存储过程(存储过程语句中含有return)---创建存储过程create procedure sp_add_table1@in_name varchar(100),@in_addr varchar(100),@in_tel varchar(100)asif(@in_name = '' or @in_name is null)return 1elsebegininsert into table1(name,addr,tel) values(@in_name,@in_addr,@in_tel)return 0end---执行存储过程<1>执行下列,返回1declare @count int exec @count = sp_add_table1 '','中三路','123456' select @count<2>执行下列,返回0declare @count int exec @count = sp_add_table1 '','中三路','123456' select @count---说明查询结果不是0就是1(3)带输出参数的存储过程(存储过程中可以有return可以没有return)例子A:---创建存储过程create procedure sp_output@output int outputasset @output = 121return 1---执行存储过程<1>执行下列,返回121declare @out intexec sp_output @out outputselect @out<2>执行下列,返回1declare @out intdeclare @count intexec @count = sp_output @out outputselect @count---说明有return,只要查询输出参数,则查询结果为输出参数在存储过程中最后变成的值;只要不查询输出参数,则查询结果为return返回的值例子B:---创建存储过程create procedure sp_output@output int outputasset @output = 121---执行存储过程<1>执行下列,返回121declare @out intexec sp_output @out outputselect @out<2>执行下列,返回0declare @out intdeclare @count intexec @count = sp_output @out outputselect @count---说明没有return,只要查询输出参数,则查询结果为输出参数在存储过程中最后变成的值;只要不查询输出参数,则查询结果为0总结:(1)存储过程共分为3类:A.返回记录集的存储过程其执行结果是一个记录集,例如:从数据库中检索出符合某一个或几个条件的记录B.返回数值的存储过程(也可以称为标量存储过程)-----其执行完以后返回一个值,例如:在数据库中执行一个有返回值的函数或命令C.行为存储过程用来实现数据库的某个功能,而没有返回值,例如:在数据库中的更新和删除操作(2)含有return的存储过程其返回值为return返回的那个值(3)没有return的存储过程,不论执行结果有无记录集,其返回值是0(4)带输出参数的存储过程:假如有return则返回return返回的那个值,假如要select输出参数,则出现输出参数的值,于有无return无关3.获得存储过程的返回值--通过程序获得SqlParameter[] cmdParms = { .. ,new SqlParameter("@return",SqlDbType.Int)};cmdParms[cmdParms.Length - 1].Direction = ParameterDirection.ReturnValue;或者cmdParms[cmdParms.Length - 1].Direction = ParameterDirection.Output或者cmdParms[cmdParms.Length - 1].Direction = ParameterDirection.Input;得到返回值object bj = cmdParms[cmdParms.Length - 1].Value;。
SQLSERVER存储过程大归纳SQL Server存储过程是SQL Server数据库中的一种对象,它是一系列预编译的SQL语句的集合,这些语句可以批量执行,提高数据库的性能和安全性。
本文将对SQL Server存储过程进行详细介绍和归纳。
SQL Server存储过程的创建和调用:1.创建存储过程:使用CREATEPROCEDURE语句创建存储过程,可以指定输入和输出参数,也可以包含其他的SQL语句和业务逻辑代码。
2.调用存储过程:使用EXECUTE或EXEC命令,后跟存储过程的名称和参数列表,可以执行存储过程并获取结果。
SQL Server存储过程的参数:1.输入参数:用于将值传递给存储过程内部使用,可以在存储过程内部进行计算和处理。
2.输出参数:用于将存储过程内部的计算结果传递给外部使用,可以在存储过程外部获取其值。
3.输入输出参数:用于同时传递值给存储过程内部和将计算结果传递给外部。
SQL Server存储过程的优点:1.提高性能:存储过程是预编译的,可以减少数据库服务器的计算开销,提高查询和处理速度。
2.简化开发:存储过程可以重复使用,可以减少编写和维护的代码量,提高开发效率。
3.增强安全性:存储过程可以通过权限设置来限制对数据库的访问权限,提高数据的安全性。
SQL Server存储过程的注意事项:1.参数的合理使用:根据实际需求,合理选择输入、输出和输入输出参数的使用方式,提高存储过程的灵活性和效率。
2.错误处理和异常情况处理:在存储过程中应该添加适当的错误处理代码,处理异常情况以避免数据丢失和不一致。
SQL Server存储过程的使用场景:1.批量操作:存储过程是批量执行的,适用于对数据库中的大量数据进行复杂的查询和更新操作。
2.定时任务:存储过程可以设置为定时执行,适用于定期批量处理数据、创建报表等任务。
3.数据校验和业务逻辑:存储过程可以包含复杂的数据校验和业务逻辑,适用于对数据库数据进行逻辑验证和处理。
SQLSERVER存储过程使用说明书引言首先介绍一下什么是存储过程:存储过程就是将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来,并且这样的语句是放在数据库中的,还可以根据条件执行不同SQL语句,那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。
请大家先看一个小例子:create proc query_bookasselect * from bookgo--调用存储过程exec query_book请大家来了解一下存储过程的语法。
Create PROC [ EDURE ] procedure_name [ ; number ][ { @parameter data_type }[ VARYING ] [ = default ] [ OUTPUT ]] [ ,...n ][ WITH{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ][ FOR REPLICATION ]AS sql_statement [ ...n ]一、参数简介1、procedure_name新存储过程的名称。
过程名必须符合标识符规则,且对于数据库及其所有者必须唯一。
要创建局部临时过程,可以在 procedure_name 前面加一个编号符 (#procedure_name),要创建全局临时过程,可以在 procedure_name 前面加两个编号符 (##procedure_name)。
完整的名称(包括 # 或 ##)不能超过 128 个字符。
指定过程所有者的名称是可选的。
2、;number是可选的整数,用来对同名的过程分组,以便用一条 Drop PROCEDURE 语句即可将同组的过程一起除去。
例如,名为 orders 的应用程序使用的过程可以命名为 orderproc;1、orderproc;2 等。
Drop PROCEDURE orderproc 语句将除去整个组。
如果名称中包含定界标识符,则数字不应包含在标识符中,只应在 procedure_name 前后使用适当的定界符。
3、@parameter过程中的参数。
在 Create PROCEDURE 语句中可以声明一个或多个参数。
用户必须在执行过程时提供每个所声明参数的值(除非定义了该参数的默认值)。
存储过程最多可以有 2100 个参数。
使用@符号作为第一个字符来指定参数名称。
参数名称必须符合标识符的规则。
每个过程的参数仅用于该过程本身;相同的参数名称可以用在其它过程中。
默认情况下,参数只能代替常量,而不能用于代替表名、列名或其它数据库对象的名称。
4、data_type参数的数据类型。
所有数据类型(包括 text、ntext 和 image)均可以用作存储过程的参数。
不过,cursor 数据类型只能用于 OUTPUT 参数。
如果指定的数据类型为 cursor,也必须同时指定 VARYING 和 OUTPUT 关键字。
说明:对于可以是cursor 数据类型的输出参数,没有最大数目的限制。
5、VARYING指定作为输出参数支持的结果集(由存储过程动态构造,内容可以变化)。
仅适用于游标参数。
6、default参数的默认值。
如果定义了默认值,不必指定该参数的值即可执行过程。
默认值必须是常量或 NULL。
如果过程将对该参数使用 LIKE 关键字,那么默认值中可以包含通配符(%、_、[] 和 [^])。
7、OUTPUT表明参数是返回参数。
该选项的值可以返回给 EXEC[UTE]。
使用 OUTPUT 参数可将信息返回给调用过程。
Text、ntext 和 image 参数可用作 OUTPUT 参数。
使用 OUTPUT 关键字的输出参数可以是游标占位符。
8、n表示最多可以指定 2100 个参数的占位符。
9、{RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTIO N}RECOMPILE 表明 SQL Server 不会缓存该过程的计划,该过程将在运行时重新编译。
在使用非典型值或临时值而不希望覆盖缓存在内存中的执行计划时,请使用 RECOMPILE 选项。
ENCRYPTION 表示 SQL Server 加密 syscomments 表中包含 Create PROCEDURE 语句文本的条目。
使用 ENCRYPTION 可防止将过程作为 SQL Server 复制的一部分发布。
说明:在升级过程中,SQL Server 利用存储在 syscomments 中的加密注释来重新创建加密过程。
10、FOR REPLICATION指定不能在订阅服务器上执行为复制创建的存储过程。
.使用 FOR REPLICATION 选项创建的存储过程可用作存储过程筛选,且只能在复制过程中执行。
本选项不能和 WITH RECOMPILE 选项一起使用。
11、AS指定过程要执行的操作。
12、sql_statement过程中要包含的任意数目和类型的 Transact-SQL 语句。
但有一些限制。
13、n是表示此过程可以包含多条 Transact-SQL 语句的占位符。
14、注释/*和*/之间的为注释,可以包含一行和多行的说明文字。
15、其他说明存储过程的最大大小为 128 MB。
二、存储过程的优点都有哪些呢?1. 存储过程只在创造时进行编译即可,以后每次执行存储过程都不需再重新编译,而我们通常使用的SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2. 经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用SP来封装数据库操作。
当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
可以极大的提高数据库的使用效率,减少程序的执行时间,这一点在较大数据量的数据库的操作中是非常重要的。
在代码上看,SQL语句和程序代码语句的分离,可以提高程序代码的可读性。
3. 存储过程可以设置参数,可以根据传入参数的不同重复使用同一个存储过程,从而高效的提高代码的优化率和可读性。
4. 安全性高,可设定只有某此用户才具有对指定存储过程的使用权存储过程的种类:(1)系统存储过程:以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作,如 sp_help就是取得指定对象的相关信息。
(2)扩展存储过程以XP_开头,用来调用操作系统提供的功能exec master..xp_cmdshell 'ping 10.8.16.1'(3)用户自定义的存储过程,这是我们所指的存储过程常用格式模版:Create procedure procedue_name [@parameter data_type][output][with]{recompil e|encryption} as sql_statement解释:output:表示此参数是可传回的with {recompile|encryption} recompile:表示每次执行此存储过程时都重新编译一次;encryption:所创建的存储过程的内容会被加密。
三、实例讲解实例1:只返回单一记录集的存储过程。
要求1:查询表bankMoney的内容的存储过程create procedure sp_query_bankMoneyasselect * from bankMoneygoexec sp_query_bankMoney注* 在使用过程中只需要把中的SQL语句替换为存储过程名,就可以了很方便吧!实例2(向存储过程中传递参数):加入一笔记录到表bankMoney,并查询此表中userID= Zhangsan的所有存款的总金额。
Create proc insert_bank @param1 char(10),@param2 varchar(20),@param3 varchar (20),@param4 int,@param5 int outputwith encryption ---------加密asinsert bankMoney (id,userID,sex,Money) Values(@param1,@param2,@param3, @p aram4)select @param5=sum(Money) from bankMoney where userID='Zhangsan' go在SQL Server查询分析器中执行该存储过程的方法是:declare @total_price intexec insert_bank '004','Zhangsan','男',100,@total_price outputprint '总余额为'+convert(varchar,@total_price)go在这里再啰嗦一下存储过程的3种传回值(方便正在看这个例子的朋友不用再去查看语法内容):1.以Return传回整数2.以output格式传回参数3.Recordset传回值的区别:output和return都可在批次程式中用变量接收,而recordset则传回到执行批次的客户端中。
实例3:使用带有复杂 Select 语句的简单过程下面的存储过程从四个表的联接中返回所有作者(提供了姓名)、出版的书籍以及出版社。
该存储过程不使用任何参数。
USE pubsIF EXISTS (Select name FROM sysobjectsWhere name = 'au_info_all' AND type = 'P')Drop PROCEDURE au_info_allGOCreate PROCEDURE au_info_allASSelect au_lname, au_fname, title, pub_nameFROM authors a INNER JOIN titleauthor taON a.au_id = ta.au_id INNER JOIN titles tON t.title_id = ta.title_id INNER JOIN publishers pON t.pub_id = p.pub_idGOau_info_all 存储过程可以通过以下方法执行:EXECUTE au_info_all-- orEXEC au_info_all如果该过程是批处理中的第一条语句,则可使用:au_info_all实例4:使用带有参数的简单过程Create PROCEDURE au_info@lastname varchar(40),@firstname varchar(20)ASSelect au_lname, au_fname, title, pub_nameFROM authors a INNER JOIN titleauthor taON a.au_id = ta.au_id INNER JOIN titles tON t.title_id = ta.title_id INNER JOIN publishers pON t.pub_id = p.pub_idWhere au_fname = @firstnameAND au_lname = @lastnameGOau_info 存储过程可以通过以下方法执行:EXECUTE au_info 'Dull', 'Ann'-- orEXECUTE au_info @lastname = 'Dull', @firstname = 'Ann' -- orEXECUTE au_info @firstname = 'Ann', @lastname = 'Dull' -- orEXEC au_info 'Dull', 'Ann'-- orEXEC au_info @lastname = 'Dull', @firstname = 'Ann'-- orEXEC au_info @firstname = 'Ann', @lastname = 'Dull'如果该过程是批处理中的第一条语句,则可使用:au_info 'Dull', 'Ann'-- orau_info @lastname = 'Dull', @firstname = 'Ann'-- orau_info @firstname = 'Ann', @lastname = 'Dull'实例5:使用带有通配符参数的简单过程Create PROCEDURE au_info2@lastname varchar(30) = 'D%',@firstname varchar(18) = '%'ASSelect au_lname, au_fname, title, pub_nameFROM authors a INNER JOIN titleauthor taON a.au_id = ta.au_id INNER JOIN titles tON t.title_id = ta.title_id INNER JOIN publishers pON t.pub_id = p.pub_idWhere au_fname LIKE @firstnameAND au_lname LIKE @lastnameGOau_info2 存储过程可以用多种组合执行。