sql自定义函数

合集下载

SQL自定义函数

SQL自定义函数
调用
select * from f2(1,1)

调用自定义函数
-- 注意,前缀dbo好像不能省略,不清楚原因 select dbo.round2(123.456,2)
删除自定义函数
drop function round2
2, 自 定 义 函 数 --返 回 一 个 表 结 构
2.1 返回的表结构自己定义
CREATE FUNCTION f1 (
-- Add the parameters for the function here @p1 int, @p2 char ) RETURNS @Table_Var TABLE ( -- Add the column definitions for the TABLE variable here c1 int, c2 int ) AS BEGIN -- Fill the table variable with the rows for your result set insert into @Table_Var values(1,2) insert into @Table_Var values(1,2) RETURN END GO
if @p1 > @interval set @Result = round(cast(@p1 as float) - cast( @interval as float),@scale)
else set @Result = 0
-- Return the result of the function RETURN @Result END
调用
select * from f1(1,1)
2.2 返回的表结构不明确定义,由 select语句决定
CREATE FUNCTION f2 (

sql 自定义函数的使用方法及实例大全

sql 自定义函数的使用方法及实例大全

SQL 自定义函数是指用户根据自己的需求编写的函数,这些函数可以完成特定的数据处理和计算任务。

在数据库管理系统中,通过自定义函数可以实现对数据的灵活操作和处理,极大地扩展了 SQL 的功能和应用范围。

本文将介绍 SQL 自定义函数的使用方法及实例,并对不同的场景进行详细的讲解和示范。

一、SQL 自定义函数的基本语法1. 创建函数:使用 CREATE FUNCTION 语句来创建自定义函数,语法如下:```sqlCREATE FUNCTION function_name (parameters)RETURNS return_typeASbeginfunction_bodyend;```2. 参数说明:- function_name:函数的名称- parameters:函数的参数列表- return_type:函数的返回类型- function_body:函数的主体部分,包括具体的逻辑和计算过程3. 示例:```sqlCREATE FUNCTION getAvgScore (class_id INT)RETURNS FLOATASbeginDECLARE avg_score FLOAT;SELECT AVG(score) INTO avg_score FROM student WHERE class = class_id;RETURN avg_score;end;```二、SQL 自定义函数的使用方法1. 调用函数:使用 SELECT 语句调用自定义函数,并将其结果用于其他查询或操作。

```sqlSELECT getAvgScore(101) FROM dual;```2. 注意事项:- 自定义函数可以和普通SQL 查询语句一样进行参数传递和结果返回;- 要确保函数的输入参数和返回值的数据类型匹配和合理;- 函数内部可以包含复杂的计算逻辑和流程控制语句。

三、SQL 自定义函数的实例大全1. 计算平均值:通过自定义函数来计算学生某门课程的平均分数。

SQL自定义函数

SQL自定义函数

“自定义函数”是我们平常的说法,而“用户定义的函数”是SQL Server 中书面的说法。

SQL Server 2000 允许用户创建自定义函数,自定义函数可以有返回值。

自定义函数分为:标量值函数或表值函数∙如果RETURNS 子句指定一种标量数据类型,则函数为标量值函数。

可以使用多条Transact-SQL 语句定义标量值函数。

∙如果RETURNS 子句指定TABLE,则函数为表值函数。

表值函数又可分为:内嵌表值函数(行内函数)或多语句函数∙如果RETURNS 子句指定的TABLE 不附带列的列表,则该函数为内嵌表值函数。

∙如果RETURNS 子句指定的TABLE 类型带有列及其数据类型,则该函数是多语句表值函数。

标量值函数示例CREATE FUNCTION dbo.Foo()RETURNS intASBEGINdeclare @n intselect @n=3return @nEND内嵌表值函数示例CREATE FUNCTION dbo.Foo()RETURNS TABLEASreturn select id, title from msgs内嵌表值函数只有一个select 语句。

多语句表值函数示例(部分)CREATE FUNCTION fn_FindReports (@InEmpId nchar(5))RETURNS @retFindReports TABLE (empid nchar(5) primary key,empname nvarchar(50) NOT NULL,mgrid nchar(5),title nvarchar(30))...注意其RETURNS 部分。

多语句函数的主体中允许使用以下语句。

未在下面的列表中列出的语句不能用在函数主体中。

∙赋值语句。

∙控制流语句。

∙DECLARE 语句,该语句定义函数局部的数据变量和游标。

∙SELECT 语句,该语句包含带有表达式的选择列表,其中的表达式将值赋予函数的局部变量。

在SQL中使用自定义函数

在SQL中使用自定义函数

在SQL中使用自定义函数1.使用CREATEFUNCTION语句:CREATEFUNCTION语句用于定义一个新的函数。

在这个语句中,我们需要指定函数的名称、参数列表、返回值类型以及函数体。

例如,下面是一个简单的示例:```CREATE FUNCTION calculate_age(birth_date DATE)RETURNSINTBEGINDECLARE age INT;SET age = TIMESTAMPDIFF(YEAR, birth_date, CURDATE();RETURN age;END;```在上面的示例中,我们定义了一个名为calculate_age的函数,它接受一个日期参数birth_date,并返回一个整数类型的年龄。

2.使用CREATEORREPLACEFUNCTION语句:CREATEORREPLACEFUNCTION 语句用于定义一个新的函数,如果函数已存在,则替换现有的函数定义。

这在需要更新函数定义时非常有用。

例如,下面是一个使用CREATEORREPLACEFUNCTION语句定义的示例:```CREATE OR REPLACE FUNCTION calculate_age(birth_date DATE)RETURNSINTBEGINDECLARE age INT;SET age = TIMESTAMPDIFF(YEAR, birth_date, CURDATE();RETURN age;END;```在上面的示例中,我们定义了一个名为calculate_age的函数,它与前面的示例相同,但使用了CREATE OR REPLACE FUNCTION语句。

3.使用DROPFUNCTION语句删除函数:DROPFUNCTION语句用于从数据库中删除一个函数。

例如,下面是一个使用DROPFUNCTION语句删除函数的示例:```DROP FUNCTION IF EXISTS calculate_age;```在上面的示例中,我们使用DROP FUNCTION语句删除了名为calculate_age的函数。

第04章 Transact-SQL语言基础 - 自定义函数

第04章 Transact-SQL语言基础 - 自定义函数

调用函数
可以省略
SELECT * from own_name.function_name [(参数值[,...n])] [ where <条件> ]
CREATE FUNCTION [ schema_name. ] function_name ( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type default ] } [ ,...n ]]) [= RETURNS @return_variable TABLE < table_type_definition > [ WITH <function_option> [ ,...n ] ] ] [ AS BEGIN function_body RETURN END
其中各参数的含义如下。 ① schema_name、function_name、@parameter_name、[ type_schema_name. ] parameter_data_type、[ = default ]、 <function_option>的含义与标量函数中的各参数相同。 ② TABLE:指定表值函数的返回值为表。 ③ select_stmt:定义内嵌表值函数的返回值的单个SELECT语句。
使用内嵌表值函数
16.2.4 使用内嵌表值函数


内嵌表值函数返回表,可在 FROM 子句中被引 用,就像视图一样 关于使用内嵌表值函数的依据和指导方针 RETURNS 子句在括号中包含单个 SELECT 语句。SELECT 语句的结果集构成函数所返 回的表 函数体不由 BEGIN 和 END 分隔 RETURNS 指定 table 作为返回的数据类型 不必定义返回变量的格式,因为它由 RETURN 子句中的 SELECT 语句的结果集

sql 存储过程中调用 自定义函数

sql 存储过程中调用 自定义函数

sql 存储过程中调用自定义函数自定义函数在SQL存储过程中的调用SQL存储过程是一段预定义的SQL代码集合,可以在数据库中进行重复使用。

而自定义函数是一段可重用的SQL代码,用于执行特定功能并返回一个值。

在SQL存储过程中,我们可以调用自定义函数来实现更加复杂的逻辑和计算。

我们需要创建一个自定义函数。

在SQL中,可以使用CREATE FUNCTION语句来定义一个函数,指定函数的名称、参数和返回值的数据类型,以及函数的主体逻辑。

例如,我们可以创建一个自定义函数来计算两个数的和:```CREATE FUNCTION calculate_sum(a INT, b INT)RETURNS INTBEGINDECLARE result INT;SET result = a + b;RETURN result;END;```在上述代码中,我们定义了一个名为calculate_sum的函数,它接受两个整数参数a和b,并返回一个整数类型的结果。

函数的主体逻辑是将a和b相加,并将结果赋值给变量result,然后通过RETURN语句返回结果。

接下来,我们可以在SQL存储过程中调用这个自定义函数。

在存储过程中,可以使用SELECT语句来调用函数并获取返回值。

例如,我们可以创建一个存储过程来计算两个数的和并输出结果:```CREATE PROCEDURE calculate_and_output_sum(a INT, b INT) BEGINDECLARE sum_result INT;SET sum_result = (SELECT calculate_sum(a, b));SELECT 'The sum of ' || a || ' and ' || b || ' is ' || sum_result; END;```在上述代码中,我们定义了一个名为calculate_and_output_sum 的存储过程,它接受两个整数参数a和b。

Expression转化为sql(三)--自定义函数

Expression转化为sql(三)--自定义函数

Expression转化为sql(三)--⾃定义函数 SQL 语句有很多函数如len(),now()等等。

如何来⽣成这些函数。

最近研究也写办法共⼤家参考。

⼀.⾸先建⽴⼀个建⼀个扩展类,控制只能允许这些函数出现,如果出现其他函数就直接报异常。

1public static class SQLMethods2 {3public static bool DB_In<T>(this T t, List<T> list) // in4 {5return true;6 }7public static Boolean DB_NotIn<T>(this T t, List<T> list) // not in8 {9return true;10 }11public static int DB_Length(this string t) // len();12 {13return0;14 }15public static bool DB_Like(this string t, string str) // like16 {17return true;18 }19public static bool DB_NotLike(this string t, string str) // not like20 {21return true;22 }23 }View Code 我们要⽣成sql,那么函数的返回值没有意思,len() ,like,和not 只能针对字符串类型, in 和not in 可以针对所有类型。

⼆.处理不同函数相关的逻辑。

1.判断函数所在类的命名空间是否我是我们要求的。

2.根据函数名处理。

出现意外函数抛出异常 代码如下"1private string DealMethodsCall(MethodCallExpression m_exp)2 {3var k = m_exp;4var g = k.Arguments[0];5///控制函数所在类名。

SQL 自定义函数

SQL 自定义函数

2、函数:函数是由一个或多个Transact-SQL语句组成的子程序,可用于封装代码以使其重新使用。

用户定义函数分3类标量函数、内联表值函数和语句表值函数。

用户定义函数采用0个或更多的输入参数并返回标量值或表。

函数最多可以有1024个输入参数。

当函数的参数有默认值时,调用该函数时必须指定DEFAULT关键字才能获取默认值。

该行为与调用含有默认参数值的存储过程不同,在调用这些指定了缺省参数值的存储过程时,省略参数值时使用缺省值,但是在调用这些指定了参数缺省值的以函数时,如果省略了DEFAULT关键字就意味着省略了缺省数值。

用户定义了函数不支持输出参数。

标量函数返回在RETURNS子句中定义的类型的单个数据值,可以使用所有标量数据类型,包括BIGINT和sql_ariant,不支持trmestamp的数据类型、用户定义数据类型和非标量类型(如table和cursor)。

在BEGIN…END块中定义的函数主体包含返回该值的Transact_SQL语句系列.返回类型可以是除text,ntext,image,cursor和timestamp之外的任何数据类型。

表值函数返回table;对于内联表值函数,没有函数主体;对于多语句表值函数,在BEGIN…END块中定义的函数主体包含TRANSACT-SQL语句,这些语句可生成行并将行插入将返回的表中。

函数中的有效语句类型包括:A:DECLARE语句,该语句可用于定义函数局部的数据变量和游标;B:赋值语句为函数局部对象赋值,如使用SET给标量和表局部变量赋值;C:游标操作语句,这些游标操作语句应用在函数中声明、打开、关闭和释放局部游标;D:控制流语句;E:SELECT语句,该语句包含带有表达式的选择列表,基中的表达式将值赋予函数的局部变量;F:INSERT、UPDATE、DELETE语句,这些语句修改函数的局部table变量;G:EXECUTE语句,该语句调用扩展存储过程。

flink 的table api 和 sql 中的自定义函数及示例

flink 的table api 和 sql 中的自定义函数及示例

FLINK 的TABLE API 和SQL 中的自定义函数及示例Apache Flink 是一个流处理和批处理的开源框架,提供了强大的数据流处理和批处理功能。

Flink 的Table API 和SQL 是其强大的数据处理工具,允许用户以声明式方式处理数据。

在Flink 的Table API 和SQL 中,你可以定义自己的函数(UDFs)来扩展其内置的功能。

以下是如何在Flink 的Table API 和SQL 中定义和使用自定义函数的示例:1.定义一个简单的自定义函数首先,我们需要定义一个简单的自定义函数,例如一个计算字符串长度的函数:javaimport org.apache.flink.table.functions.ScalarFunction;public class StringLength extends ScalarFunction {public Integer eval(String s) {if (s == null) {return null;}return s.length();}}2.注册自定义函数在你的Flink SQL 环境中,你需要注册这个函数,使其可以被SQL 查询使用:javatEnv.createTemporarySystemFunction("StringLength", StringLength.class);3.使用自定义函数现在你可以在SQL 查询中使用这个函数了:sqlSELECT StringLength(name) AS name_length FROM your_table;4.示例假设你有一个名为 users 的表,其中有一个名为 name 的列,你可以使用上面的自定义函数来计算每个名字的长度:sqlSELECT name, StringLength(name) AS name_length FROM users;这只是一个简单的示例,Flink 的Table API 和SQL 支持更复杂的自定义函数和功能。

SQL自定义函数

SQL自定义函数

SQL函数 SQL函数
系统函数 —标量函数 标量函数
系统函数 标量函数 聚合函数 行集函数。 行集函数。 标量函数 标量函数对单一值操作,返回单一值。 标量函பைடு நூலகம்对单一值操作,返回单一值。只要在能够使用表达式的 地方,就可以使用标量函数。 地方,就可以使用标量函数。 数学函数 日期和时间函数 字符串函数 数据类型转换函数 。
SQL函数 SQL函数
系统函数—标量函数 标量函数
数学函数 5、 rand(整型表达式 整型表达式) 、 整型表达式 功能:返回一个位于0和 之间的随机数 之间的随机数, 功能:返回一个位于 和1之间的随机数,在单个查询中反复调用 rand( )将产生相同的值。 将产生相同的值。 将产生相同的值 例:DECLARE @counter smallint SET @counter = 1 WHILE @counter < 5 BEGIN SELECT RAND(@counter) Random_Number SET NOCOUNT ON SET @counter = @counter + 1 SET NOCOUNT OFF END GO
SQL函数 SQL函数
系统函数—标量函数 标量函数
数学函数 1、abs(数值型表达式 数值型表达式) 、 数值型表达式 功能: 的绝对值,其值的数据类型与参数一致。 功能:返回表达式 的绝对值,其值的数据类型与参数一致。 例:SELECT ABS(-1), ABS(0), ABS(1) 2、ceiling(数值型表达式 数值型表达式) 、 数值型表达式 功能:返回最小的大于或等于给定数值型表达式的整数值, 功能:返回最小的大于或等于给定数值型表达式的整数值,值的 类型和给定的值相同。 类型和给定的值相同。 floor(数值型表达式 数值型表达式) 数值型表达式 功能:返回最大的小于或等于给定数值型表达式的整数值。 功能:返回最大的小于或等于给定数值型表达式的整数值。 例:SELECT FLOOR(123.45),CEILING(123.45) SELECT FLOOR(-123.45), CEILING(-123.45)

Sql Server中常用的6个自定义函数介绍

Sql Server中常用的6个自定义函数介绍

S QL S ERVER中常用的6个自定义函数介绍这篇文章主要介绍了Sql Server中常用的6个自定义函数,本文包含提取数字、提取英文、提取中文、过滤重复字符等函数,需要的朋友可以参考下。

在日常应用中,往往根据实际需求录入一些值,而这些值不能直接使用,所以Sql中经常会对字段值进行一些常规的处理。

这里搜集了(提取数字、英文、中文、过滤重复字符、分割字符的方法),方便日后查询使用。

一、判断字段值是否有中文复制代码代码如下:--SQL 判断字段值是否有中文create&nbsp; function&nbsp; fun_getCN(@str&nbsp; nvarchar(4000))returns&nbsp; nvarchar(4000)asbegindeclare&nbsp; @word&nbsp; nchar(1),@CN&nbsp; nvarchar(4000)set&nbsp; @CN=&#39;&#39;while&nbsp; len(@str)&gt;0beginset&nbsp; @word=left(@str,1)if unicode(@word)&nbsp; between&nbsp; 19968&nbsp; and&nbsp; 19968+20901set&nbsp; @CN=@CN+@wordset&nbsp; @str=right(@str,len(@str)-1)endreturn&nbsp; @CNendselect dbo.fun_getCN(&#39;ASDKG论坛KDL&#39;)--论坛select dbo.fun_getCN(&#39;ASDKG論壇KDL&#39;)--論壇select dbo.fun_getCN(&#39;ASDKDL&#39;)--空二、提取数字复制代码代码如下:IF OBJECT_ID(&#39;DBO.GET_NUMBER2&#39;) IS NOT NULL DROP FUNCTION DBO.GET_NUMBER2GOCREATE FUNCTION DBO.GET_NUMBER2(@S VARCHAR(100)) RETURNS VARCHAR(100)ASBEGINWHILE PATINDEX(&#39;%[ -9]%&#39;,@S) &gt; 0BEGINset@s=stuff(@s,patindex(&#39;%[ -9]%&#39;,@s),1,&#39;&#39 ;)ENDRETURN @SENDGO--测试PRINT DBO.GET_NUMBER(&#39;呵呵ABC123ABC&#39;) GO--123三、提取英文复制代码代码如下:--提取英文IF OBJEC#39;,@s),1,&#39;&#39;)ENDRETURN @SENDGO--测试PRINT DBO.GET_STR(&#39;呵呵ABC123ABC&#39;)GO四、提取中文复制代码代码如下:--提取中文IF OBJECT_ID(&#39;DBO.CHINA_STR&#39;) IS NOT NULL DROP FUNCTION DBO.CHINA_STRGOCREATE FUNCTION DBO.CHINA_STR(@法)复制代码代码如下:--过滤重复字符IF OBJECT_ID(&#39;DBO.DISTINCT_STR&#39;) IS NOT NULL DROP FUNCTION DBO.DISTINCT_STRGOCREATE FUNCTION DBO.DISTINCT_STR(@S NVARCHAR(100),@SPLIT VARCHAR(50))RETURNS VARCHAR(100)ASBEGINIF @S IS NULL RETURN(NULL)DECLARE @NEW VARCHAR(50),@INDEX INT,@TEMP VARCHAR(50)IF LEFT(@S,1)&lt;&gt;@SPLITSET @S = @SPLIT+@SIF RIGHT(@S,1)&lt;&gt;@SPLITSET @S = @S+@SPLITWHILE CHARINDEX(@SPLIT,@S)&gt;0 AND LEN(@S)&lt;&gt;1 BEGINSET @INDEX = CHARINDEX(@SPLIT,@S)SET @TEMP = LEFT(@S,CHARINDEX(@SPLIT,@S,@INDEX+LEN(@SPLIT)))IF @NEW IS NULLSET @NEW = ISNULL(@NEW,&#39;&#39;)+@TEMPELSESET @NEW = ISNULL(@NEW,&#39;&#39;)+REPLACE(@TEMP,@SPLIT,&#39; &#39;)+@SPLITWHILE CHARINDEX(@TEMP,@S)&gt;0BEGINSET@S=STUFF(@S,CHARINDEX(@TEMP,@S)+LEN(@SPLIT),CHAR INDEX(@SPLIT,@S,CHARINDEX(@TEMP,@S)+LEN(@SPLIT))-C HARINDEX(@TEMP,@S),&#39;&#39;)ENDENDRETURNRIGHT(LEFT(@NEW,LEN(@NEW)-1),LEN(LEFT(@NEW,LEN(@N EW)-1))-1)ENDGOPRINTDBO.DISTINCT_STR(&#39;A,A,B,C,C,B,C,&#39;,&#39;,&#39;) --A,B,CGO-------------------------------------------------------------------- --过滤重复字符2IF OBJECT_ID(&#39;DBO.DISTINCT_STR2&#39;) IS NOT NULL DROP FUNCTION DBO.DISTINCT_STR2GOCREATE FUNCTION DBO.DISTINCT_STR2(@S varchar(8000)) RETURNS VARCHAR(100)ASBEGINIF @S IS NULL RETURN(NULL)DECLARE @NEW VARCHAR(50),@INDEX INT,@TEMP VARCHAR(50)WHILE LEN(@S)&gt;0BEGINSET @NEW=ISNULL(@NEW,&#39;&#39;)+LEFT(@S,1)SET @S=REPLACE(@S,LEFT(@S,1),&#39;&#39;)ENDRETURN @NEWENDGOSELECT DBO.DISTINCT_STR2(&#39;AABCCD&#39;)--ABCDGO六、根据特定字符串分割字段值复制代码代码如下:IF OBJECT_ID(&#39;DBO.SPLIT_STR&#39;) IS NOT NULL DROP FUNCTION DBO.SPLIT_STRGOCREATE FUNCTION DBO.SPLIT_STR(@S varchar(8000),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --包含多个数据项的字符串@INDEXint,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; --要获取的数据项的位置@SPLIT varchar(10)&nbsp;&nbsp;&nbsp;&nbsp; --数据分隔符RETURNS VARCHAR(100)ASBEGINIF @S IS NULL RETURN(NULL)DECLARE @SPLITLEN intSELECT @SPLITLEN=LEN(@SPLIT+&#39;A&#39;)-2WHILE @INDEX&gt;1 AND CHARINDEX(@SPLIT,@S+@SPLIT)&gt;0SELECT@INDEX=@INDEX-1,@S=STUFF(@S,1,CHARINDEX(@SPLIT,@ S+@SPLIT)+@SPLITLEN,&#39;&#39;)RETURN(ISNULL(LEFT(@S,CHARINDEX(@SPLIT,@S+@SPLIT)-1),&#39;&#39;))ENDGOPRINT DBO.SPLIT_STR(&#39;AA|BB|CC&#39;,2,&#39;|&#39;) --GO以上就是精品学习网为大家提供的关于Sql Server中常用的6个自定义函数的相关内容,希望能够帮助到大家。

sqlserver自定义函数写法

sqlserver自定义函数写法

sqlserver自定义函数写法SQL Server中的自定义函数可以使用T-SQL语言编写,可以是标量函数、表值函数或聚合函数。

以下是一些常见的自定义函数写法示例:1. 标量函数标量函数返回单个值,可以接受一个或多个参数。

以下是一个简单的标量函数示例,它接受一个整数参数并返回该参数的平方:```CREATE FUNCTION dbo.Square(@num INT)RETURNS INTASBEGINRETURN @num * @num;END```2. 表值函数表值函数返回一个表格,可以接受一个或多个参数。

以下是一个简单的表值函数示例,它接受一个整数参数并返回一个包含该参数及其平方的表格:```CREATE FUNCTION dbo.Squares(@num INT)RETURNS TABLEASRETURN(SELECT @num AS Number, @num * @num AS Square)```3. 聚合函数聚合函数返回一个单一的聚合值,可以接受一个或多个参数。

以下是一个简单的聚合函数示例,它接受一个整数参数并返回该参数的平均值:```CREATE FUNCTION dbo.Average(@nums VARCHAR(MAX))RETURNS FLOATASBEGINDECLARE @sum FLOAT = 0;DECLARE @count INT = 0;DECLARE @pos INT = 1;WHILE @pos <= LEN(@nums)BEGINDECLARE @num VARCHAR(10) = '';WHILE ISNUMERIC(SUBSTRING(@nums, @pos, 1)) = 1 AND @pos <= LEN(@nums)BEGINSET @num = @num + SUBSTRING(@nums, @pos, 1);SET @pos = @pos + 1;ENDIF @num <> ''BEGINSET @sum = @sum + CAST(@num AS FLOAT);SET @count = @count + 1;ENDSET @pos = @pos + 1;ENDIF @count > 0RETURN @sum / @count;ELSERETURN NULL;END```以上是一些常见的自定义函数写法示例,可以根据具体需求进行修改和扩展。

SQL自定义函数

SQL自定义函数
例如创建一个函数,输入学生的编号,输出学生、老师、及家长的姓名,如下:
(1)在查询分析界面输入代码:
/*创建一个带学生编号参数的多语句表值函数*/
USEtest
GO
CREATEFUNCTIONselect_info(@idINT)
RETURNS@informationTABLE
(
学生姓名CHAR(20),
(ห้องสมุดไป่ตู้)在查询分析界面输入代码:
/*在test数据库中创建带学生编号参数的函数*/
USEtest
GO
CREATEFUNCTIONselect_student(@idINT)
RETURNSTABLE
AS
RETURN
AS'学生姓名',
AS'老师姓名'
FROMstudent sINNERJOINteachers t
ONs.parents_id=p.idWHEREs.id=@id
RETURN
END;
GO
SELECT* fromdbo.select_info(2006005)
GO
注:自定义函数前面都要加上所有者(dbo)
创建函数中的限制语句
修改/重新命名/删除函数
语法如下:
ALTER FUNCTION function_name
函数:的一个特性就是具有返回值,如f(x)=x+2,函数除了提供最基本的计算功能外,更主要的功能则是对表数据的格式化,以及对系统信息的查询。
语法类似于存储过程,可以看作是一个带着返回值的特殊存储过程。
自定义函数分类:
1标量函数
2内嵌表值函数
3多语句表值函数
标量函数:
是一个简单的数值,例如:int、char、decimal等,但是不能够返回text、ntext、image、cursor和timestamp作为参数。标量函数的函数体要以begin开始,end结束。

sql自定义函数

sql自定义函数

除了使用系统提供的函数外,用户还可以根据需要自定义函数。

用户自定义函数(User De fined Functions)是SQL Server 2000 新增的数据库对象,是SQL Server 的一大改进。

用户自定义函数不能用于执行一系列改变数据库状态的操作,但它可以像系统函数一样在查询或存储过程等的程序段中使用,也可以像存储过程一样通过EXECUTE 命令来执行。

用户自定义函数中存储了一个Transact-SQL 例程,可以返回一定的值。

在SQL Server 2000 中根据函数返回值形式的不同将用户自定义函数分为三种类型:标量型函数(Scalar functions)标量型函数返回一个确定类型的标量值其返回值类型为除TEXT、NTEXT、IMAGE、CURSOR、TIMESTAMP 和TABLE 类型外的其它数据类型。

函数体语句定义在BEGIN-END语句内,其中包含了可以返回值的Transact-SQL 命令。

内联表值型函数(Inline ta ble-valued functions)内联表值型函数以表的形式返回一个返回值,即它返回的是一个表内联表值型函数没有由BEGIN-END 语句括起来的函数体。

其返回的表由一个位于RETURN 子句中的SELEC T 命令段从数据库中筛选出来。

内联表值型函数功能相当于一个参数化的视图。

多声明表值型函数(Multi-statement table-valued functions)多声明表值型函数可以看作标量型和内联表值型函数的结合体。

它的返回值是一个表,但它和标量型函数一样有一个用BEGIN-END 语句括起来的函数体,返回值的表中的数据是由函数体中的语句插入的。

由此可见,它可以进行多次查询,对数据进行多次筛选与合并,弥补了内联表值型函数的不足。

13.13.1 创建用户自定义函数SQL Server 2000 为三种类型的用户自定义函数提供了不同的命令创建格式。

经典SQL自定义函数

经典SQL自定义函数

1、确定某‎年某月有多‎少天实‎现原理:先‎利用DAT‎E DIFF‎取得当前月‎的第一天,‎再将月份加‎一取得下月‎第一天,然‎后减去1分‎钟,再取日‎期的‎‎‎‎天数‎部分,即为‎当月最大日‎期,也即当‎月天数‎C REAT‎E FUN‎C TION‎Days‎I nMon‎t h ( ‎@date‎date‎t ime ‎) Ret‎u rns ‎i ntA‎SBEG‎I NR‎E TURN‎Day(‎d atea‎d d(mi‎,-3,D‎A TEAD‎D(m, ‎D ATED‎I FF(m‎,0,@d‎a te)+‎1,0))‎)END‎调用示‎例:s‎e lect‎dbo.‎D aysI‎n Mont‎h ('2‎006-0‎2-03'‎)(2‎)计算哪一‎天是本周的‎星期一‎S ELEC‎T DAT‎E ADD(‎w eek,‎DATE‎D IFF(‎w eek,‎'1900‎-01-0‎1',ge‎t date‎()), ‎'1900‎-01-0‎1') ‎--返回2‎006-1‎1-06 ‎00:00‎:00.0‎00或‎S ELEC‎T DAT‎E ADD(‎w eek,‎DATE‎D IFF(‎w eek,‎0,get‎d ate(‎)),0)‎‎(3)‎当前季度的‎第一天‎S ELEC‎T DAT‎E ADD(‎q uart‎e r, D‎A TEDI‎F F(qu‎a rter‎,0,ge‎t date‎()), ‎0)—返回‎2006-‎10-01‎00:0‎0:00.‎000‎(4)一个‎季度多少天‎dec‎l are ‎@m ti‎n yint‎,@tim‎e sma‎l ldat‎e time‎sel‎e ct @‎m=mon‎t h(ge‎t date‎())s‎e lect‎@m=c‎a se w‎h en @‎m bet‎w een ‎1 and‎3 th‎e n 1‎‎‎‎‎ wh‎e n @m‎betw‎e en 4‎and ‎6 the‎n 4‎‎‎‎‎ whe‎n @m ‎b etwe‎e n 7 ‎and ‎9 the‎n 7‎‎‎‎‎ els‎e 10 ‎e nd‎s elec‎t @ti‎m e=da‎t enam‎e(yea‎r,get‎d ate(‎))+'-‎'+con‎v ert(‎v arch‎a r(10‎),@m)‎+'-01‎'sel‎e ct d‎a tedi‎f f(da‎y,@ti‎m e,da‎t eadd‎(mm,3‎,@tim‎e)) —‎返回92‎1.按‎姓氏笔画排‎序:Se‎l ect ‎* Fro‎m Tab‎l eNam‎e Ord‎e r By‎Cust‎o merN‎a me C‎o llat‎e Chi‎n ese_‎P RC_S‎t roke‎_ci_a‎s2.数‎据库加密:‎sele‎c t en‎c rypt‎('原始密‎码')s‎e lect‎pwde‎n cryp‎t('原始‎密码')‎s elec‎t pwd‎c ompa‎r e('原‎始密码',‎'加密后密‎码') =‎1--相‎同;否则不‎相同 en‎c rypt‎('原始密‎码')s‎e lect‎pwde‎n cryp‎t('原始‎密码')‎s elec‎t pwd‎c ompa‎r e('原‎始密码',‎'加密后密‎码') =‎1--相‎同;否则不‎相同3.‎取回表中字‎段:de‎c lare‎@lis‎t var‎c har(‎1000)‎,@sql‎nvar‎c har(‎1000)‎sele‎c t @l‎i st=@‎l ist+‎','+b‎.name‎from‎syso‎b ject‎s a,s‎y scol‎u mns ‎b whe‎r e a.‎i d=b.‎i d an‎da.n‎a me='‎表A's‎e t @s‎q l='s‎e lect‎'+ri‎g ht(@‎l ist,‎l en(@‎l ist)‎-1)+'‎from‎表A'‎e xec ‎(@sql‎)4.查‎看硬盘分区‎:EXE‎C mas‎t er..‎x p_fi‎x eddr‎i ves‎5.比较A‎,B表是否‎相等:i‎f (se‎l ect ‎c heck‎s um_a‎g g(bi‎n ary_‎c heck‎s um(*‎)) fr‎o m A)‎‎=‎(sele‎c t ch‎e cksu‎m_agg‎(bina‎r y_ch‎e cksu‎m(*))‎from‎B)p‎r int ‎'相等'‎e lse‎p rint‎'不相等‎'6.杀‎掉所有的事‎件探察器进‎程:DE‎C LARE‎hcfo‎r each‎CURS‎O R GL‎O BAL ‎F OR S‎E LECT‎'kil‎l '+R‎T RIM(‎s pid)‎FROM‎mast‎e r.db‎o.sys‎p roce‎s ses‎W HERE‎prog‎r am_n‎a me I‎N('SQ‎L pro‎f iler‎',N'S‎Q L 事件‎探查器')‎EXEC‎sp_m‎s fore‎a ch_w‎o rker‎'?'‎7.记录搜‎索:开头‎到N条记录‎Sele‎c t To‎p N *‎From‎表--‎-----‎-----‎-----‎-----‎-----‎----‎N到M条记‎录(要有主‎索引ID)‎Sele‎c t To‎p M-N‎* Fr‎o m 表‎W here‎ID i‎n (Se‎l ect ‎T op M‎ID F‎r om 表‎) Ord‎e r by‎ID ‎D esc ‎-----‎-----‎-----‎-----‎-----‎-----‎----‎N到结尾记‎录Sel‎e ct T‎o p N ‎* Fro‎m表 O‎r der ‎b y ID‎Desc‎8.如何‎修改数据库‎的名称:‎s p_re‎n amed‎b 'ol‎d_nam‎e', '‎n ew_n‎a me'‎9:获取当‎前数据库中‎的所有用户‎表sel‎e ct N‎a me f‎r om s‎y sobj‎e cts ‎w here‎xtyp‎e='u'‎and ‎s tatu‎s>=0‎10:获取‎某一个表的‎所有字段‎s elec‎t nam‎e fro‎m sys‎c olum‎n s wh‎e re i‎d=obj‎e ct_i‎d('表名‎')11‎:查看与某‎一个表相关‎的视图、存‎储过程、函‎数sel‎e ct a‎.* fr‎o m sy‎s obje‎c ts a‎, sys‎c omme‎n ts b‎wher‎e a.i‎d = b‎.id a‎n d b.‎t ext ‎l ike ‎'%表名%‎' 12:‎查看当前数‎据库中所有‎存储过程‎s elec‎t nam‎e as ‎存储过程名‎称 fro‎m sys‎o bjec‎t s wh‎e re x‎t ype=‎'P'1‎3:查询用‎户创建的所‎有数据库‎s elec‎t * f‎r om m‎a ster‎..sys‎d atab‎a ses ‎D whe‎r e si‎d not‎in(s‎e lect‎sid ‎f rom ‎m aste‎r..sy‎s logi‎n s wh‎e re n‎a me='‎s a')‎或者se‎l ect ‎d bid,‎name‎AS D‎B_NAM‎E fro‎m mas‎t er..‎s ysda‎t abas‎e s wh‎e re s‎i d <>‎0x01‎14:查‎询某一个表‎的字段和数‎据类型s‎e lect‎colu‎m n_na‎m e,da‎t a_ty‎p e fr‎o m in‎f orma‎t ion_‎s chem‎a.col‎u mns‎w here‎tabl‎e_nam‎e = '‎表名'[‎n].[标‎题]:S‎e lect‎* Fr‎o m Ta‎b leNa‎m e Or‎d er B‎y Cus‎t omer‎N ame‎[n].[‎标题]:‎S elec‎t * F‎r om T‎a bleN‎a me O‎r der ‎B y Cu‎s tome‎r Name‎----‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎----‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎----‎S ql优化‎是一项复杂‎的工作,以‎下的一些基‎本原则是本‎人看书时所‎记录下来的‎,很明确且‎没什么废话‎:1.‎索引的使用‎:(1)‎.当插入的‎数据为数据‎表中的记录‎数量的10‎%以上,首‎先需要删除‎该表的索引‎来提高数据‎的插入效率‎,当数据插‎入后,再建‎立索引。

SqlServer中常用的6个自定义函数分享

SqlServer中常用的6个自定义函数分享

SqlServer中常⽤的6个⾃定义函数分享在⽇常应⽤中,往往根据实际需求录⼊⼀些值,⽽这些值不能直接使⽤,所以Sql中经常会对字段值进⾏⼀些常规的处理。

这⾥搜集了(提取数字、英⽂、中⽂、过滤重复字符、分割字符的⽅法),⽅便⽇后查询使⽤。

⼀、判断字段值是否有中⽂--SQL 判断字段值是否有中⽂create function fun_getCN(@str nvarchar(4000))returns nvarchar(4000)asbegindeclare @word nchar(1),@CN nvarchar(4000)set @CN=''while len(@str)>0beginset @word=left(@str,1)if unicode(@word) between 19968 and 19968+20901set @CN=@CN+@wordset @str=right(@str,len(@str)-1)endreturn @CNendselect dbo.fun_getCN('ASDKG论坛KDL')--论坛select dbo.fun_getCN('ASDKG論壇KDL')--論壇select dbo.fun_getCN('ASDKDL')--空⼆、提取数字IF OBJECT_ID('DBO.GET_NUMBER2') IS NOT NULLDROP FUNCTION DBO.GET_NUMBER2GOCREATE FUNCTION DBO.GET_NUMBER2(@S VARCHAR(100))RETURNS VARCHAR(100)ASBEGINWHILE PATINDEX('%[^0-9]%',@S) > 0BEGINset @s=stuff(@s,patindex('%[^0-9]%',@s),1,'')ENDRETURN @SENDGO--测试PRINT DBO.GET_NUMBER('呵呵ABC123ABC')GO--123三、提取英⽂--提取英⽂IF OBJECT_ID('DBO.GET_STR') IS NOT NULLDROP FUNCTION DBO.GET_STRGOCREATE FUNCTION DBO.GET_STR(@S VARCHAR(100))RETURNS VARCHAR(100)ASBEGINWHILE PATINDEX('%[^a-z]%',@S) > 0BEGINset @s=stuff(@s,patindex('%[^a-z]%',@s),1,'')ENDRETURN @SENDGO--测试PRINT DBO.GET_STR('呵呵ABC123ABC')GO四、提取中⽂--提取中⽂IF OBJECT_ID('DBO.CHINA_STR') IS NOT NULLDROP FUNCTION DBO.CHINA_STRGOCREATE FUNCTION DBO.CHINA_STR(@S NVARCHAR(100))RETURNS VARCHAR(100)ASBEGINWHILE PATINDEX('%[^吖-座]%',@S) > 0SET @S = STUFF(@S,PATINDEX('%[^吖-座]%',@S),1,N'')RETURN @SENDGOPRINT DBO.CHINA_STR('呵呵ABC123ABC')GO五、过滤重复字段(多种⽅法)--过滤重复字符IF OBJECT_ID('DBO.DISTINCT_STR') IS NOT NULLDROP FUNCTION DBO.DISTINCT_STRGOCREATE FUNCTION DBO.DISTINCT_STR(@S NVARCHAR(100),@SPLIT VARCHAR(50))RETURNS VARCHAR(100)ASBEGINIF @S IS NULL RETURN(NULL)DECLARE @NEW VARCHAR(50),@INDEX INT,@TEMP VARCHAR(50)IF LEFT(@S,1)<>@SPLITSET @S = @SPLIT+@SIF RIGHT(@S,1)<>@SPLITSET @S = @S+@SPLITWHILE CHARINDEX(@SPLIT,@S)>0 AND LEN(@S)<>1BEGINSET @INDEX = CHARINDEX(@SPLIT,@S)SET @TEMP = LEFT(@S,CHARINDEX(@SPLIT,@S,@INDEX+LEN(@SPLIT)))IF @NEW IS NULLSET @NEW = ISNULL(@NEW,'')+@TEMPELSESET @NEW = ISNULL(@NEW,'')+REPLACE(@TEMP,@SPLIT,'')+@SPLITWHILE CHARINDEX(@TEMP,@S)>0BEGINSET @S=STUFF(@S,CHARINDEX(@TEMP,@S)+LEN(@SPLIT),CHARINDEX(@SPLIT,@S,CHARINDEX(@TEMP,@S)+LEN(@SPLIT))-CHARINDEX(@TEMP,@S),'') ENDENDRETURN RIGHT(LEFT(@NEW,LEN(@NEW)-1),LEN(LEFT(@NEW,LEN(@NEW)-1))-1)ENDGOPRINT DBO.DISTINCT_STR('A,A,B,C,C,B,C,',',')--A,B,CGO----------------------------------------------------------------------过滤重复字符2IF OBJECT_ID('DBO.DISTINCT_STR2') IS NOT NULLDROP FUNCTION DBO.DISTINCT_STR2GOCREATE FUNCTION DBO.DISTINCT_STR2(@S varchar(8000))RETURNS VARCHAR(100)ASBEGINIF @S IS NULL RETURN(NULL)DECLARE @NEW VARCHAR(50),@INDEX INT,@TEMP VARCHAR(50)WHILE LEN(@S)>0BEGINSET @NEW=ISNULL(@NEW,'')+LEFT(@S,1)SET @S=REPLACE(@S,LEFT(@S,1),'')ENDRETURN @NEWENDGOSELECT DBO.DISTINCT_STR2('AABCCD')--ABCDGO六、根据特定字符串分割字段值IF OBJECT_ID('DBO.SPLIT_STR') IS NOT NULLDROP FUNCTION DBO.SPLIT_STRGOCREATE FUNCTION DBO.SPLIT_STR(@S varchar(8000), --包含多个数据项的字符串@INDEX int, --要获取的数据项的位置@SPLIT varchar(10) --数据分隔符)RETURNS VARCHAR(100)ASBEGINIF @S IS NULL RETURN(NULL)DECLARE @SPLITLEN intSELECT @SPLITLEN=LEN(@SPLIT+'A')-2WHILE @INDEX>1 AND CHARINDEX(@SPLIT,@S+@SPLIT)>0SELECT @INDEX=@INDEX-1,@S=STUFF(@S,1,CHARINDEX(@SPLIT,@S+@SPLIT)+@SPLITLEN,'') RETURN(ISNULL(LEFT(@S,CHARINDEX(@SPLIT,@S+@SPLIT)-1),''))ENDGOPRINT DBO.SPLIT_STR('AA|BB|CC',2,'|')--GO。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

SQL Server 2005 自定义函数语汇小结
由于工作的需要,了解下SQL Server 2005 函数的写法,现在总结一下:
对于SQL Server 2005 数据库而言,函数与存储过程在语法方面是有很大的相同点,
最大的不同就是函数有返回值,直接使用returns ,而存储过程则使用output来声明输出变量
一、下面先说明下,如何创建函数
1、创建没有返回值与没有参数的函数
CREATE FUNCTION my_function()
AS
BEGIN
DECLARE @variable varchar(255) --声明字符型变量
DECLARE @variable int --声明整形型变量
...(do something)
SET @variable = '12345' --对变量variable赋值
END
2、创建没有返回值有参数的函数
CREATE FUNCTION my_function(@user_Name varchar(128),@password int(6))
AS
BEGIN
DECLARE @variable_1 varchar(255) --声明字符型变量
...(do something)
SET @variable_1 = @user_Name + convert(varchar(255),@password) --将变量@user_Name与@password连接赋给@variable_1,其中convert()函数是将int型转为varchar型
END
3、创建有返回值与有参数的函数
CREATE FUNCTION my_function(@user_Name varchar(128),@password int(6))
returns varchar(255)--设置返回值,记住是returns 而不是return
AS
BEGIN
DECLARE @result varchar(5)
DECLARE @fagle varchar(5)
SET @result = select er_Name from USERS as users where er_Name = @user_Name and users.password = @password
IF @result = ''
BEGIN
SET @fagle = 'NO'
END
ELSE
BEGIN
SET @falge = 'YES'
END
return @result --返回结果
END
二、删除一个函数语法
DROP FUNCTION my_function
三、执行一个函数语法
select dbo.my_function(...) --根据有没参数来处理
go
--注:在SQL Server 2005 中,有内部函数与外部函数,数据库系统自带函数,如sum(),count()等等,这些称为内部函数,而我们自定义的函数称为外部函数。

--在执行函数语法中,也有些区别,如执行内部函数:select sum(total) from ...,那么执行外部函数则需要在函数名前加dbo. + 自定义函数名,如
--select dbo.my_function()
--go
四、下面提供二个例子
1、日期判断,判断传进来的日期是否在上个月日到本月日之间
--请注意convert()函数的用法
create function isNewContract(@date varchar(32))
returns varchar(32)
AS
begin
declare @begin_time varchar(32)
declare @end_time varchar(32)
declare @temp varchar(4)
declare @result varchar(32)
declare @month varchar(2)
set @begin_time=convert(varchar,DATEPART(year, getdate())) + '-'
set @end_time=convert(varchar,DATEPART(year, getdate())) + convert(varchar, DATEPART(month, getdate())) + convert(varchar, '14')
set @temp=convert(varchar(2),(month(getDate())-1 ))
if(@temp < 10 )
begin
set @begin_time = @begin_time + convert(varchar(1),'0') + @temp + '-' + convert(varchar, '15')
end
if(@date >= @begin_time and @date <= @end_time)
begin
set @result = '是'
end
else
begin
set @result = @begin_time
end
return @result
end
2、查询多条记录合并成一条记录返回,并写入EXECL表中,进行分行换行显示,其中使用游标进行循环处理
--在数据库中,EXECL默认换行符ACSII码为'10',在合并字符串之前,需要先转为EXECL识别
的换行符,具体使用chat()内部函数处理
create function getExportReportCollect(@projectId int ,@month varchar(64))
returns varchar(4096) --设置返回值
AS
begin
declare @num varchar(2)
declare @end varchar(10)
declare @Result varchar(4096) --用于返回查询结果
declare city_cursor cursor for --声明游标变量
select reported.id
from dbo.Investment_Budget_Reported as reported
left join dbo.Investment_Budget_Contract as con
on reported.contractId = con.id
where reported.[month] = @month and reported.projectId = @projectId
set @Result=''
set @num = '1'
set @end = '10' --导入EXECL表中,换行符的ACSII码
declare @Field int --声明临时存放CityID的变量
open city_cursor --打开游标
fetch next from city_cursor into @Field --将实际ID赋给变量
while(@@fetch_status = 0) --循环开始
begin
if((select [content] from dbo.Investment_Budget_Reported where id = @Field )is not null) BEGIN
if(@Result = '')
select @Result = @Result + @num + '、' + [content] from dbo.Investment_Budget_Reported where id = @Field
else
select @Result = @Result + @num + '、' + [content] from dbo.Investment_Budget_Reported where id = @Field
set @Result = @Result + char(@end) --让换行符转为EXECL认识的换行符
set @num = @num + 1
END
fetch next from city_cursor into @Field --下一个reportId
end
close city_cursor --关闭游标
deallocate city_cursor --释放游标引用
return @Result
end。

相关文档
最新文档