深爱那片海 发表于 2015-1-16 22:17:01

MYSQL编程:详解SQLServer 存储历程

即使对于MySQL的商业化的企业版来说,也没有高昂的许可证成本,当你将其与像甲骨文和微软之类的大型专有商业数据库比较的话。SqlServer的存储历程是一个被定名的存储在服务器上的Transacation-Sql语句汇合,是封装反复性事情的一种办法,它撑持用户声明的变量、前提实行和其他壮大的编程功效。SqlServer的存储历程是一个被定名的存储在服务器上的Transacation-Sql语句汇合,是封装反复性事情的一种办法,它撑持用户声明的变量、前提实行和其他壮大的编程功效。
存储历程相对其他的数据库会见办法有以下的长处:
(1)反复利用。存储历程能够反复利用,从而能够削减数据库开辟职员的事情量。
(2)进步功能。存储历程在创立的时分就举行了编译,未来利用的时分不必再从头编译。一样平常的SQL语句每实行一次就必要编译一次,以是利用存储历程进步了效力。
(3)削减收集流量。存储历程位于服务器上,挪用的时分只必要传送存储历程的称号和参数就能够了,因而下降了收集传输的数据量。
(4)平安性。参数化的存储历程能够避免SQL注进式的打击,并且能够将Grant、Deny和Revoke权限使用于存储历程。
存储历程一共分为了三类:用户界说的存储历程、扩大存储历程和体系存储历程。
个中,用户界说的存储历程又分为Transaction-SQL和CLR两品种型。
Transaction-SQL存储历程是指保留的Transaction-SQL语句汇合,能够承受和前往用户供应的参数。
CLR存储历程是指对.NetFramework大众言语运转时(CLR)办法的援用,能够承受和前往用户供应的参数。他们在.NetFramework程序会合是作为类的大众静态办法完成的。(本文就不作先容了)
创立存储历程的语句以下:
以下为援用的内容:
CREATE{PROCPROCEDURE}procedure_name[;number]
[{@parameterdata_type}
[=default][
][,n]


AS{<sql_statement>[;]<method_specifier>}
[;]
<procedure_option>::=



<sql_statement>::=
{statements}
<method_specifier>::=
EXTERNALNAMEassembly_name.class_name.method_name


:代表的是存储历程所属的架构的称号
比方:
CreateSchemayangyang8848
Go
CreateProcyangyang8848.AllGoods
AsSelect*FromMaster_Goods
Go
实行:ExecAllGoods产生毛病。
实行:Execyangyang8848.AllGoods准确实行。
[;Number]:用于对同名历程举行分组的可选整数。利用一个DROPPROCEDURE语句可将这些分组历程一同删除。
比方:
CreateProcS1;1
AS
Select*FromMaster_Goods
Go
CreateProcS1;2
As
Select*FromMaster_Location
Go
创立终了了两个存储历程。它们在统一个组S1里,假如实行ExecS1则存储历程默许实行ExecS1;1。假如我们想失掉一切据点信息则必要实行ExecS1;2。当我们要删除存储历程的时分,只能实行DropExecS1则该组内一切的存储历程被删除。
[@parameter]:存储过程当中的参数,除非将参数界说的时分有默许值大概将参数设置为即是另外一个参数,不然用户必需在挪用存储历程的时分为参数赋值。
存储历程最多有2100个参数。
比方:
CreateProcyangyang8848.OneGoods
@GoodsCodevarchar(10)
As
Select*FromMaster_GoodsWhereGoodsCode=@GoodsCode
Go
挪用的代码:
Declare@Codevarchar(10)
Set@Code=0004
Execyangyang8848.OneGoods@Code
在参数的后边到场Output标明该参数为输入参数。
CreateProcyangyang8848.OneGoods
@GoodsCode2varchar(10)output,@GoodsCodevarchar(10)=0011
As
Select*FromMaster_GoodsWhereGoodsCode=@GoodsCode
Set@GoodsCode2=0005
Go
挪用办法:
Declare@VV2varchar(10)
Execyangyang8848.OneGoods@Codeout
注重:假如存储历程的两个参数一个有默许值一个没有,那末我们要把有默许值得放在后边,否则会出成绩哦~~
仔细的伴侣,大概看到上边的语句有一些分歧,好比,存储历程用的是output,而挪用语句用的是out。我要告知您,二者是一样的。

:唆使数据库引擎不缓存该历程的企图,该历程在运转时编译。假如指定了FORREPLICATION,则不克不及利用此选项。关于CLR存储历程,不克不及指定RECOMPILE。

这个说一个十分好用的函数OBJECT_ID:前往架构局限内工具的数据库工具标识号。
比方:我们创立存储历程时,能够以下写代码
IfObject_ID(yangyang8848.OneGoods)IsNotNull
DropProcyangyang8848.OneGoods
Go
CreateProcyangyang8848.OneGoods
@GoodsCode2varchar(10)out,@GoodsCodevarchar(10)=0011
As
Select*FromMaster_GoodsWhereGoodsCode=@GoodsCode
Set@GoodsCode2=0005
Go
针关于上边的这个存储历程,我们挪用以下SQL查询
SelectdefinitionFromsys.sql_modules
Whereobject_id=Object_ID(yangyang8848.OneGoods);
我们是能够查到了局的。
但是假如我们对该存储历程到场那末你将没法看就任何了局
IfObject_ID(yangyang8848.OneGoods)IsNotNull
DropProcyangyang8848.OneGoods
Go
CreateProcyangyang8848.OneGoods
@GoodsCode2varchar(10)out,@GoodsCodevarchar(10)=0011
WithEncryption
As
Select*FromMaster_GoodsWhereGoodsCode=@GoodsCode
Set@GoodsCode2=0005
Go
然后我们查询sys.sql_modules目次视图,将前往给你Null。
然后我们实行以下SQL:Execsp_helptextyangyang8848.OneGoods
你将失掉以下了局:Thetextforobjectyangyang8848.OneGoodsisencrypted.
说到这里你应当分明了,参数:是一种加密的功效,将CREATEPROCEDURE语句的原始文本转换为含混格局。含混代码的输入在SQLServer2005的任何目次视图中都不克不及间接显现。对体系表或数据库文件没有会见权限的用户不克不及检索含混文本。可是,可经由过程DAC端口会见体系表的特权用户或间接会见数据库文件的特权用户可以使用此文本。别的,可以向服务器历程附加调试器的用户可在运转时从内存中检索已解密的历程。
前两天写了一篇关于游标的先容文章,下边写一个例子,将游标与存储历程一同利用上:
IfObject_ID(dbo.GetMasterGoods)IsNotNull
DropProcdbo.GetMasterGoods
Go
CreateProcGetMasterGoods
@MyCursorCursorVaryingOutput
WithEncryption
As
Set@MyCursor=Cursor
For
SelectGoodsCode,GoodsNameFromMaster_Goods
Open@MyCursor
Go
--下边创建别的一个存储历程,用于遍历游标输入了局
CreateProcGetAllGoodsIDAndName
As
Declare@GoodsCodevarchar(18)
Declare@GoodsNamenvarchar(20)
Declare@MasterGoodsCursorCursor
ExecGetMasterGoods@MasterGoodsCursorout
FetchNextFrom@MasterGoodsCursor
InTo@GoodsCode,@GoodsName
While(@@Fetch_Status=0)
Begin
Begin
Print@GoodsCode+:+@GoodsName
End
FetchNextFrom@MasterGoodsCursor
InTo@GoodsCode,@GoodsName
End
Close@MasterGoodsCursor
Deallocate@MasterGoodsCursor
Go
最初实行ExecGetAllGoodsIDAndName了局为以下内容
0003:品0003
0004:品0004
0005:123123
0006:品0006
0007:品0007
0008:品0008
0009:品0009
0010:品0010
0011:品0011
0012:品0012
0013:品0013
0014:品0014

即使对于MySQL的商业化的企业版来说,也没有高昂的许可证成本,当你将其与像甲骨文和微软之类的大型专有商业数据库比较的话。

冷月葬花魂 发表于 2015-1-19 06:41:06

财务软件要用SQL也只是后台的数据库而已,软件都是成品的,当然多学东西肯定是有好处的..

因胸联盟 发表于 2015-1-25 14:00:53

我是新手,正在学习数据库和操作系统,深感理论的泛广,唯有一步一步来,但是又感觉时间不够,收集了很多资料却总是没能认真的看完,希望有一个讨论板块,大家共同解决,共同分享,共同努力

蒙在股里 发表于 2015-2-2 22:20:21

然后最好有实践机会,能够把实践到的和实践结合起来,其实理论思考是个非常困扰和痛苦的事情

若天明 发表于 2015-2-8 14:19:29

分区表是个亮点!从分区表也能看出微软要做大作强SQLServer的信心。资料很多,这里不详细说。但是重点了解的是:现在的SQLServer2005的表,都是默认为分区表的。因为它要支持滑动窗口的这个特性。这种特性对历史数据和实时数据的处理是很有帮助的。

变相怪杰 发表于 2015-2-25 18:45:50

以前的DTS轻盈简单。但是现在的SSIS虽然功能强大了很多,但是总是让人感觉太麻烦。看看论坛中询问SSIS的贴子就知道。做的功能太强大了,往往会有很多用户不会用了

海妖 发表于 2015-3-8 01:40:27

微软对CLR作了大篇幅的宣传,这是因为数据库产品终于融入.net体系中。最开始我们也是狂喜,感觉对象数据库的一些概念可以实现了。

若相依 发表于 2015-3-15 19:43:26

having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。

admin 发表于 2015-3-22 03:11:23

对递归类的树遍历很有帮助。个人感觉这个真是太棒了!阅读清晰,非常有时代感。
页: [1]
查看完整版本: MYSQL编程:详解SQLServer 存储历程