仓酷云

标题: MSSQL网站制作之剖析MS SQL Server里函数的两种用法 [打印本页]

作者: 变相怪杰    时间: 2015-1-16 22:23
标题: MSSQL网站制作之剖析MS SQL Server里函数的两种用法
支持大型的数据库。可以处理拥有上千万条记录的大型数据库。server|函数SQLServer里函数的两种用法(能够取代游标)
  1.由于update里不克不及用存储历程,但是要依据更新表的某些字段还要举行盘算。我们经常接纳游标的办法,这里用函数的办法完成。
  函数部分:
以下是援用片断:
  CREATEFUNCTION[DBO].[FUN_GETTIME](@TASKPHASEIDINT)
  RETURNSFLOATAS
  BEGIN
  DECLARE@TASKIDINT,
  @HOURFLOAT,
  @PERCENTFLOAT,
  @RETURNFLOAT
  IF@TASKPHASEIDISNULL
  BEGIN
  RETURN(0.0)
  END
  SELECT@TASKID=TASKID,@PERCENT=ISNULL(WORKPERCENT,0)/100
  FROMTABLETASKPHASE
  WHEREID=@TASKPHASEID
  SELECT@HOUR=ISNULL(TASKTIME,0)FROMTABLETASK
  WHEREID=@TASKID
  SET@RETURN=@HOUR*@PERCENT
  RETURN(@RETURN)
  END


  挪用函数的存储历程部分
以下是援用片断:
  CREATEPROCEDURE[DBO].[PROC_CALCCA]
  @ROIDINT
  AS
  BEGIN
  DECLARE@CAFLOAT
  UPDATETABLEFMECA
  SET
  Cvalue_M=ISNULL(MODERATE,0)*ISNULL(FMERATE,0)*ISNULL(B.BASFAILURERATE,0)*[DBO].[FUN_GETTIME](C.ID)
  FROMTABLEFMECA,TABLERELATIONB,TABLETASKPHASEC
  WHEREROID=@ROIDANDTASKPHASEID=C.IDANDB.ID=@ROID
  SELECT@CA=SUM(ISNULL(Cvalue_M,0))FROMTABLEFMECAWHEREROID=@ROID
  UPDATETABLERELATION
  SETCRITICALITY=@CA
  WHEREID=@ROID
  END
  GO
  2.我们要依据某表的某些纪录,先盘算后乞降,由于没法存储两头值,平常我们也用游标的办法举行盘算。但sqlserver2000里撑持
  SUM([ALL|DISTINCT]expression)
  expression
  是常量、列或函数,大概是算术、按位与字符串等运算符的恣意组合。因而我们能够使用这一功效。
  函数部分:
以下是援用片断:
  CREATEFUNCTION[DBO].[FUN_RATE](@PARTIDINT,@ENIDINT,@SOURCEIDINT,@QUALITYIDINT,@COUNTINT)
  RETURNSFLOATAS
  BEGIN
  DECLARE@QXSFLOAT,@GFLOAT,@RATEFLOAT
  IF(@ENID=NULL)OR(@PARTID=NULL)OR(@SOURCEID=NULL)OR(@QUALITYID=NULL)
  BEGIN
  RETURN(0.0)
  END
  SELECT@QXS=ISNULL(XS,0)FROMTABLEQUALITYWHEREID=@QUALITYID
  SELECT@G=ISNULL(FRATE_G,0)FROMTABLEFAILURERATE
  WHERE(SUBKINDID=@PARTID)AND(ENID=@ENID)AND(DATASOURCEID=@SOURCEID)AND(((ISNULL(MINCOUNT,0)<=ISNULL(@COUNT,0))AND(ISNULL(MAXCOUNT,0)>=ISNULL(@COUNT,0)))
  OR(ISNULL(@COUNT,0)>ISNULL(MAXCOUNT,0)))
  SET@RATE=ISNULL(@QXS*@G,0)
  RETURN(@RATE)
  END

  挪用函数的存储历程部分:
以下是援用片断:
  CREATEPROCPROC_FAULTRATE
  @PARTIDINTEGER,@QUALITYIDINTEGER,@SOURCEIDINTEGER,@COUNTINTEGER,@ROIDINT,@GRADEINT,@RATEFLOAT=0OUTPUTAS
  BEGIN
  DECLARE
  @TASKIDINT
  SET@RATE=0.0
  SELECT@TASKID=ISNULL(TASKPROID,-1)FROMTABLERELATIONWHEREID=(SELECTPIDFROMTABLERELATIONWHEREID=@ROID)
  IF(@TASKID=-1)OR(@GRADE=1)BEGIN
  SET@RATE=0
  RETURN
  END
  SELECT@RATE=SUM([DBO].[FUN_RATE](@PARTID,ENID,@SOURCEID,@QUALITYID,@COUNT)*ISNULL(WORKPERCENT,0)/100.0)
  FROMTABLETASKPHASE
  WHERETASKID=@TASKID
  END
  GO

  函数还能够前往表等,但愿人人一同会商sqlserver里函数的妙用。

MySQL这个名字是怎么来的已经不清楚了。基本指南和大量的库和工具带有前缀“my”已经有10年以上,而且不管怎样,MySQLAB创始人之一的的女儿也叫My。
作者: 山那边是海    时间: 2015-1-19 10:18
理解了存储结构,再阅读下性能优化的章节基本上会对sqlserver有个清晰地认识
作者: 柔情似水    时间: 2015-1-19 10:18
总感觉自己还是不会SQL
作者: 灵魂腐蚀    时间: 2015-1-24 14:16
你可以简单地认为适合的就是好,不适合就是不好。
作者: 兰色精灵    时间: 2015-2-1 16:49
还不是性能有问题!否则面向对象的数据库早就实现了!建议使用CLR的地方一般是和应用的复杂程度或操作系统环境有很高的耦合度的场景。如你想构建复杂的算法,并且用到了大量的指针和高级数据模型。
作者: 小妖女    时间: 2015-2-7 10:01
索引视图2k就有。但是2005对其效率作了一些改进但是schema.viewname的作用域真是太限制了它的应用面。还有一大堆的环境参数和种种限制都让人对它有点却步。
作者: 第二个灵魂    时间: 2015-2-21 16:48
having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。
作者: 蒙在股里    时间: 2015-3-6 20:30
而SQLServer如果能像Oracle一样可以为登陆分配如:5%的cpu,10%的内存。就可以解决这个漏洞。
作者: 金色的骷髅    时间: 2015-3-13 08:17
如安全管理、备份恢复、性能监控和调优等,SQL只要熟悉基本操作就可以,只要程序设计部分只要稍加了解即可(如存储过程、触发器等)。
作者: 飘飘悠悠    时间: 2015-3-20 17:28
备份方面可能还是一个老大难的问题。不能单独备份几个表总是感觉不爽。灵活备份的问题不知道什么时候才能解决。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2