39470.htm
来自「一本很基础的SQL讲解」· HTM 代码 · 共 54 行
HTM
54 行
<link href="./dzs_cs.css" rel="stylesheet" type="text/css" /><table width="96%" border="0" align="center" cellpadding="0" cellspacing="0"> <tr> <td> </td> </tr> <tr> <td height="24" align="center" valign="bottom" class="d_font3">分析SQL Server里函数的两种用法</td> </tr> <tr> <td height="3" bgcolor="#E3E3E3"></td> </tr> <tr> <td> </td> </tr> <tr> <td class="d_font4"><P>1.因为update里不能用存储过程,然而要根据更新表的某些字段还要进行计算。我们常常采用游标的方法,这里用函数的方法实现。</P>
<P>函数部分:</P>
<P>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><P> CREATE FUNCTION [DBO].[FUN_GETTIME] (@TASKPHASEID INT) <BR> RETURNS FLOAT AS <BR> BEGIN <BR> DECLARE @TASKID INT, <BR> @HOUR FLOAT, <BR> @PERCENT FLOAT, <BR> @RETURN FLOAT <BR> IF @TASKPHASEID IS NULL <BR> BEGIN <BR> RETURN(0.0) <BR> END <BR> SELECT @TASKID=TASKID,@PERCENT=ISNULL(WORKPERCENT,0)/100 <BR> FROM TABLETASKPHASE <BR> WHERE <A href="mailto:ID=@TASKPHASEID">ID=@TASKPHASEID</A> <BR> SELECT @HOUR=ISNULL(TASKTIME,0) FROM TABLETASK <BR> WHERE <A href="mailto:ID=@TASKID">ID=@TASKID</A> <BR> SET @RETURN=@HOUR*@PERCENT <BR> RETURN (@RETURN) <BR> END </P></PRE></TD></TR></TBODY></TABLE></P>
<P>调用函数的存储过程部分:</P>
<P>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><P> CREATE PROCEDURE [DBO].[PROC_CALCCA] <BR> @ROID INT <BR> AS <BR> BEGIN <BR> DECLARE @CA FLOAT <BR> UPDATE TABLEFMECA <BR> SET <BR> Cvalue_M= ISNULL(MODERATE,0)*ISNULL(FMERATE,0)</P><P> *ISNULL(B.BASFAILURERATE,0)*[DBO].[FUN_GETTIME](C.ID) <BR> FROM TABLEFMECA ,TABLERELATION B,TABLETASKPHASE C <BR> WHERE <A href="mailto:ROID=@ROID">ROID=@ROID</A> AND TASKPHASEID=C.ID AND <A href="mailto:B.ID=@ROID">B.ID=@ROID</A> <BR> SELECT @CA=SUM(ISNULL(Cvalue_M,0)) FROM TABLEFMECA WHERE <A href="mailto:ROID=@ROID">ROID=@ROID</A> <BR> UPDATE TABLERELATION <BR> SET <A href="mailto:CRITICALITY=@CA">CRITICALITY=@CA</A> <BR> WHERE <A href="mailto:ID=@ROID">ID=@ROID</A> <BR> END <BR> GO </P></PRE></TD></TR></TBODY></TABLE></P>
<P>2.我们要根据某表的某些记录,先计算后求和,因为无法存储中间值,平时我们也用游标的方法进行计算。但sqlserver2000里支持:</P>
<P>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><P> SUM ( [ ALL | DISTINCT ] expression )<BR> expression</P></PRE></TD></TR></TBODY></TABLE></P>
<P>是常量、列或函数,或者是算术、按位与字符串等运算符的任意组合。因此我们可以利用这一功能。</P>
<P>函数部分:</P>
<P>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><P> CREATE FUNCTION [DBO].[FUN_RATE] (@PARTID INT,@ENID INT,@SOURCEID INT, </P><P> @QUALITYID INT,@COUNT INT) <BR> RETURNS FLOAT AS <BR> BEGIN <BR> DECLARE @QXS FLOAT, @G FLOAT, @RATE FLOAT <BR> IF (@ENID=NULL) OR (@PARTID=NULL) OR (@SOURCEID=NULL) OR (@QUALITYID=NULL) <BR> BEGIN <BR> RETURN(0.0) <BR> END <BR> SELECT @QXS= ISNULL(XS,0) FROM TABLEQUALITY WHERE <A href="mailto:ID=@QUALITYID">ID=@QUALITYID</A> <BR> SELECT @G=ISNULL(FRATE_G,0) FROM TABLEFAILURERATE <BR> WHERE (<A href="mailto:SUBKINDID=@PARTID">SUBKINDID=@PARTID</A>) AND( <A href="mailto:ENID=@ENID">ENID=@ENID</A>) AND ( <A href="mailto:DATASOURCEID=@SOURCEID">DATASOURCEID=@SOURCEID</A>) </P><P> AND( ( (ISNULL(MINCOUNT,0)<=ISNULL(@COUNT,0)) AND </P><P> ( ISNULL(MAXCOUNT,0)>=ISNULL(@COUNT,0))) <BR> OR(ISNULL(@COUNT,0)>ISNULL(MAXCOUNT,0))) <BR> SET @RATE=ISNULL(@QXS*@G,0) <BR> RETURN (@RATE) <BR> END </P></PRE></TD></TR></TBODY></TABLE></P>
<P>调用函数的存储过程部分:</P>
<P>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><P> CREATE PROC PROC_FAULTRATE <BR> @PARTID INTEGER, @QUALITYID INTEGER, @SOURCEID INTEGER, @COUNT INTEGER, </P><P> @ROID INT, @GRADE INT,@RATE FLOAT=0 OUTPUTAS <BR> BEGIN <BR> DECLARE <BR> @TASKID INT <BR> SET @RATE=0.0 <BR> SELECT @TASKID=ISNULL(TASKPROID,-1) FROM TABLERELATION WHERE </P><P> ID=(SELECT PID FROM TABLERELATION WHERE <A href="mailto:ID=@ROID">ID=@ROID</A>) <BR> IF (@TASKID=-1) OR(@GRADE=1) BEGIN <BR> SET @RATE=0 <BR> RETURN <BR> END <BR> SELECT @RATE=SUM([DBO].[FUN_RATE] (@PARTID,ENID,@SOURCEID, </P><P> @QUALITYID,@COUNT) *ISNULL(WORKPERCENT,0)/100.0) <BR> FROM TABLETASKPHASE <BR> WHERE <A href="mailto:TASKID=@TASKID">TASKID=@TASKID</A> <BR> END <BR> GO </P></PRE></TD></TR></TBODY></TABLE></P>
<P>函数还可以返回表等,希望大家一起讨论sqlserver里函数的妙用。</P>
<P align=right>(责任编辑 火凤凰 <A href="mailto:sunsj@51cto.com">sunsj@51cto.com</A> TEL:(010)68476636-8007)</P></td> </tr> <tr> <td class="d_font4"> </td> </tr> </table>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?