仓酷云

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

[学习教程] MSSQL教程之UDF―SQL Server 2000的新特征

[复制链接]
只想知道 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:20:58 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

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

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

x
InnoDB数据表的索引,与InnoDB数据表相比,在InnoDB数据表上,索引对InnoDB数据表的重要性要大得多。在InnoDB数据表上,索引不仅会在搜索数据记录时发挥作用,还是数据行级锁定机制的苊、基础。本文将先容MicrosoftSQLServer2000的新增特征―用户自界说函数User-DefinedFunction(UDF),并演示几个经常使用的实例。
  UDF的功效相似SQLServer中内建的体系函数,如CONVERT、SUBSTRING、DATAADD、GETDATA、ISNULL等等。一个UDF能够没有参数,大概带有一个或多个参数,函数运转后将会前往一个函数值。界说UDF的语法以下:CREATEFUNCTION[owner_name.]function_name
({{@parameter_namescalar_parameter_data_type
[,…n]])
RETURNscalar_return_data_type
[WITH<function_option>[,…n]]
[AS]
BEGIN
Function_body
RETURNscalar_expression
END
每一个UDF能够带有0个到1024个参数,每一个参数能够是除timestamp、cursor、table之外一切的数据范例;函数前往值的限定要更多一些,它不成所以text、ntext、image、timestamp、cursor和table。
函数体是UDF的次要部分,它有两个选项:ENCRYOTION和SCHEMABINDING。
SCHEMABINDING是SQLServer2000的新增功效,能够和视图一同利用。该选项不同意删除和修正被该函数援用的工具。如许能够避免有效的函数和视图对它们援用的工具举行布局上的修正。
人人会注重到函数体以Begin入手下手,End停止。这一点分歧于创立存储历程、触发器和视图。当您忘了写上Begin/End时,体系会前往一个提醒信息“Incorrectsyntaxnear‘RETURN’”。为何不间接说少了Begin/End,这有点让人隐晦。
上面我用几个例子来讲明UDF的使用。
GreatestandLeast
  为了区分于体系函数Max和Min,我给新函数定名为Greatest和Least,它们会从以参数情势输出的两个值中找出最年夜值和最小值。
Case语句是两个函数的中心:
CASEWHENvalue1>value2THENvalue1ELSEvalue2END
固然函数很复杂,但用处是很广的。
CREATEFUNCTIONdbo.Greatest
--Returnthemaximumoftwoparameters
(@Val1SQL_VARIANT,
@Val2SQL_VARIANT)
RETURNSSQL_VARIANT
AS
BEGIN
RETURN(CASEWHEN@val1>@val2THEN@val1ELSE@val2END)
END
go
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD



CREATEFUNCTIONdbo.Least
--Returntheminimumoftwoparameters
(@val1SQL_VARIANT,
@val2SQL_VARIANT)
RETURNSSQL_VARIANT
AS
BEGIN
RETURN(CASEWHEN@val1<@val2THEN@val1ELSE@val2END)
END
Go
巨细写转换函数
该函数有两个参数:@String和@Capitalize_What。
根据@Capitalize_What的值,函数有分歧的功效:
¨@Capitalize_What=‘string’“
函数将@string的第一个非空字符转换成年夜写,其他部分改成小写。
¨@Capitalize_What=‘sentence’
函数将@string中的每句的首个非空字符转换为年夜写,句子其他部分转换为小写。断句的根据是’.’、’!’、’?’
¨@Capitalize_What=‘word’
函数将@string中的每一个词都转换成首字符年夜写,其他小写的情势。
CREATEFUNCTIONdbo.Capitalize(
--Capitalizethefirstcharacterofeveryword,
--sentence,orthewholestring.Puttheresttolowercase.
@StringVARCHAR(8000),
@Capitalize_WhatVARCHAR(8)=’string’
--String:Capitalizethefirstletterofthestring
--Sentence:Capitalizethefirstletterofeverysentence.
--Delimiters:./!/?
--Word:Capitalizethefirstletterofeveryword.
--Delimiters:anycharactersotherthanlettersanddigits.
)
RETURNSVARCHAR(8000)
AS
BEGIN
DECLARE@PositionSMALLINT,
@CharCHAR(1),
@First_CharCHAR(1),
@Word_StartSMALLINT
SET@Capitalize_What=LOWER(@Capitalize_What)
SET@Word_Start=0
IF@Capitalize_WhatIN(‘word’,‘sentence’)
BEGIN
SET@Position=DATALENGTH(@String)
WHILE@Position>=0BEGIN
SET@Char=CASE@Position
WHEN0THEN’.’
ELSEUPPER(SUBSTRING(
@String,@Position,
1))
END
IF@CharBETWEEN’A’AND’Z’
OR@CharBETWEEN’0’and’9’BEGIN
SET@Word_Start=@Position
SET@First_Char=UPPER(@Char)
END
ELSEBEGIN
IF@Capitalize_What=’word’
OR@Charin(’.’,’!’,’?’)BEGIN
IF@Word_Start>0
AND@First_CharBETWEEN’A’
AND’Z’
SET@String=STUFF(
@String,@Word_Start,
1,@First_Char)
SET@Word_Start=0
END
END
SET@Position=@Position-1
END
END
ELSEBEGIN--Capitalizethefirstcharacter
SET@Position=0
WHILE@Position<DATALENGTH(@String)
BEGIN
SET@Position=@Position+1
SET@Char=UPPER(SUBSTRING(@String,
@Position,1))
IF@CharBETWEEN’A’AND’Z’
OR@CharBETWEEN’0’AND’9’BEGIN
SET@String=STUFF(@String,
@Position,1,@Char)
SET@Position=9999
END
END
END
RETURN(@String)
END
go


小结
SQLServer2000的UDF的使用是很普遍的,它会给编程职员带来极年夜的便当。您能够创建本人的’system’UDF,存在Master数据库中,能够为任何数据库举行挪用。
UDF也有不敷,我们晓得体系函数能够恣意调有,不论您利用年夜写、小写大概巨细写夹杂。UDF却不可,它是巨细写敏感的。
在将来的版本中,我但愿微软为UDF增添默许值的功效,今后我们能够如许界说一个函数。
CREATFUNCTIONdbo.Test_default
(@parmint=0)
RETURNINT
AS
BEGIN
RETURN(@parm)
END
UDF中诸云云类的小成绩另有很多,但愿UDF的功效愈来愈壮大,我们编程职员事情起来就会愈来愈轻松。
你看出了作者的深度?深处半米!当初是冲那么多的大牛给他写序才买的,后来才发现无啥内容,作者也只是才用几年的新手,百花了几十两银子,再次感叹当今社会的虚伪与浮躁
变相怪杰 该用户已被删除
10#
发表于 2015-3-25 02:54:18 | 只看该作者
多走走一此相关论坛,多看一些实例开发,多交流0经验,没什么的,我也是刚学没多久!加油
飘飘悠悠 该用户已被删除
9#
发表于 2015-3-17 21:08:27 | 只看该作者
可能有的朋友会抱怨集成的orderby,其实如果使用ranking函数,Orderby是少不了的。如果担心Orderby会影响效率,可以为orderby的字段建立聚集索引,查询计划会忽略orderby操作(因为本来就是排序的嘛)。
飘飘悠悠 该用户已被删除
8#
发表于 2015-3-17 21:08:24 | 只看该作者
语句级快照和事务级快照终于为SQLServer的并发性能带来了突破。个人感觉语句级快照大家应该应用。事务级快照,如果是高并发系统还要慎用。如果一个用户总是被提示修改不成功要求重试时,会杀人的!
飘灵儿 该用户已被删除
7#
发表于 2015-3-11 04:54:44 | 只看该作者
所以你总能得到相应的升级版本,来满足你的需求。
不帅 该用户已被删除
6#
发表于 2015-3-2 17:41:27 | 只看该作者
现在是在考虑:如果写到服务器端,我一下搞他个10个存储过程导过去,那久之服务器不就成垃圾箱了吗?即便优化了我的中间层.
因胸联盟 该用户已被删除
5#
发表于 2015-2-11 18:33:03 | 只看该作者
大侠们有推荐的书籍和学习方法写下吧。
再见西城 该用户已被删除
地板
发表于 2015-2-5 12:09:04 | 只看该作者
然后最好有实践机会,能够把实践到的和实践结合起来,其实理论思考是个非常困扰和痛苦的事情
山那边是海 该用户已被删除
板凳
发表于 2015-1-27 20:11:06 | 只看该作者
很多书籍啊,不过个人认为看书太慢,还不如自己学。多做实际的东西,就会遇到很多问题,网上搜下解决问题。不断重复这个过程,在配合sql的F1功能。
柔情似水 该用户已被删除
沙发
发表于 2015-1-19 09:08:16 | 只看该作者
一个百万级别的基本信息表A,一个百万级别的详细记录表B,A中有个身份证id,B中也有身份id;先要找出A中在B的详细记录。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-22 23:17

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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