函数(Sql Server 数据库)

函数

一、函数分类

系统函数:聚合函数,数值函数,日期和时间函数,字符串函数,转换函数

自定义函数标量值函数(返回具体值)表值函数(返回一个结果集)

二、字符串函数

函数名

描述

举例

CHARINDEX

用来寻找一个指定的字符串在另一个字符串中的起始位置

 

ELECT CHARINDEX(‘SQL','My SQL Course',1 )

 

LEN

 

返回传递给它的字符串长度

 

SELECT LEN('SQL Server课程')

 

LOWER

 

把传递给它的字符串转换为小

SELECT LOWER('SQL Server课

UPPER

 

把传递给它的字符串转换为大

SELECT UPPER('sql server课程'

LTRIM

 

清除字符左边的空格

 

SELECT LTRIM ('  周智宇  ')

返回:周智宇  (后面的空格保

RTRIM

 

清除字符右边的空格

 

SELECT RTRIM ('  周智宇

RIGHT(LE

从字符串右边(左边)返回指定

SELECT RIGHT('买卖提.吐尔松',3)

返回:吐尔松

 

REPLACE

 

替换一个字符串中的字符

 

SELECT REPLACE('莫乐可切.杨可','可','兰')

 

三、日期函数

函数名

描述

举例

GETDATE

 

取得当前的系统日期

 

SELECT GETDATE()

返回:今天的日期

 

DATEADD

 

将指定的数值添加到指定的日期部分后的日期

 

SELECT DATEADD(mm,4,’01/01/99’)

返回:以当前的日期格式返回05/01/99

 

DATEDIFF

 

两个日期之间的指定日期部分的区别

SELECT DATEDIFF(mm,’01/01/99’,’05/01/99’)

返回:4

 

DATENAME

 

日期中指定日期部分的字符串形式

 

SELECT DATENAME(dw,’01/01/2000’)

返回:Saturday

 

DATEPART

 

日期中指定日期部分的整数形式

 

SELECT DATEPART(day, ’01/15/2000’)

返回:15

 

YEAR/MONTH/DAY

 

日期中指定年、月、日部分

 

SELECT YEAR(GETDATE())

返回:2008

 

四、数学函数

函数名

描述

举例

ABS

 

取数值表达式的绝对值

 

SELECT ABS(-43)

返回:43

 

CEILING

 

返回大于或等于所给数字表达式的最小整数

 

SELECT CEILING(43.5)

返回:44

 

FLOOR

 

取小于或等于指定表达式的最大整数

 

SELECT FLOOR(43.5)

返回:43

 

POWER

 

取数值表达式的幂值

 

SELECT POWER(5,2)

返回:25

 

ROUND

 

将数值表达式四舍五入为指定精度

 

SELECT ROUND(43.543,1)

返回:43.5

 

Sign

 

对于正数返回+1,对于负数返回-1,对于0 则返回0

 

SELECT SIGN(-43)

返回:-1

 

Sqrt

 

取浮点表达式的平方根

 

SELECT SQRT(9)

返回:3

 

五、转换函数

函数名

描述

举例

CONVERT/CAST

用来转变数据类型

 

SELECT CONVERT (VARCHAR (5),12345)

返回:字符串12345

 

DATALENGTH

 

返回用于指定表达式的字节数

 

SELECT DATALENGTH (‘我爱中国')

返回:8

 

六、自定义函数

1. 标量函数

1.1标量函数基本语法:

         Create function 函数名(参数)

         returns 返回值数据类型

         [with {Encryption | Schemabinding }]

         [as]

         begin

                  SQL语句(必须有return 变量或值)
End

1.2案例:

Create Function F_sum1(@a int, @b int)

Returns int        --返回值类型(int)

As

Begin

    Return @a+@b   --返回和,是具体的值

End

1.3调用标量值函数:

  set @s = dbo.F_sum1(100,50)  --传入参数100、50,标量值函数的返回值需变量来接收

  --调用函数必须要带dbo.否则视为系统函数

  print @s

2.表格值函数

2.1.表格值基本语法:

         create function 函数名(参数)

         returns table

         [with {Encryption | Schemabinding }]

         as

         return(一条SQL语句)

2.2案例:

create function F_name(@a int, @b varchar(33))  --参数定义时带长度

returns varchar(50)                           --返回值类型时带长度

as

begin

         return convert(varchar,@a)+@b         --转换时可不带长度

end

2.3调用:

declare @c varchar(50)                         --声明时要带长度

set @c=dbo.f_name(100000,'明天')

print @c

2.4注意事项:

(1).内联表值函数不用写begin...end

(2).内联表值函数返回的是一张表(结果集)

(3).内联表值函数的调用,就如同调一张表一样,归根结底,是对结果集的操作

  用表名,只是将结果集套了一个名字

3.多句表格值函数

3.1基本语法:

 create function 函数名(参数)

 returns 表格变量名 table (表格变量定义)

   [with {Encryption | Schemabinding }]

as

   begin

    SQL语句

   End

3.2案例:

create function FUNC_UserTab_2(@myId int)

returns @t table(

    [ID] [int] NOT NULL,

    [Oid] [int] NOT NULL,

    [Login] [nvarchar](50) NOT NULL,

    [Rtx] [nvarchar](4) NOT NULL,

    [Name] [nvarchar](5) NOT NULL,

    [Password] [nvarchar](max) NULL,

    [State] [nvarchar](8) NOT NULL

)

3.3调用

as

begin

    insert into @t

    select * from ST_User where ID<@myId

    return

end

3.4注意事项:

  (1). 可以返回表变量

  (2). 限制颇多,包括

    不能使用output参数;

    不能用临时表;

    函数内部的操作不能影响到外部环境;

    不能通过select返回结果集;

    不能update,delete,数据库表;

(3). 必须return 一个标量值或表变量

多句表格值函数包含多条SQL语句,至少有一条在表格变量中填上数据值

表格变量格式

returns @变量名 table (column 定义| 约束定义 [,…])

对表格变量中的行可执行select,insert,update,delete , 但select into 和 insert 语句的结果集是从存储过程插入。

七、字符串截取函数(题目)

CREATE function Get_StrArrayStrOfIndex

(

@str varchar(1024), --要分割的字符串

@split varchar(10), --分隔符号

@index int --取第几个元素

)

returns varchar(1024)

as

begin

declare @location int

declare @start int

declare @next int

declare @seed int

set @str=ltrim(rtrim(@str))

set @start=1

set @next=1

set @seed=len(@split)

set @location=charindex(@split,@str)

while @location<>0 and @index>@next

begin

   set @start=@location+@seed

   set @location=charindex(@split,@str,@start)

   set @next=@next+1

end

if @location =0 select @location =len(@str)+1

--这儿存在两种情况:1、字符串不存在分隔符号 2、字符串中存在分隔符号,跳出while循环后,@location为0,那默认为字符串后边有一个分隔符号。

 

return substring(@str,@start,@location-@start)

end

 

--调用示例:select dbo.Get_StrArrayStrOfIndex('8,9,4',',',2)

八、面试题

1.面试题一:

13-1,13-2,13-3,13-10,13-100,13-108,13-10,13-100,13-109、13-18,13-11,13-15,14-1,14-22,14-1要求对其进行有序排序:

 

分析:

首先要搞清楚这是字符串;

1.先对“-”前面的进行排序

2.再对“-”后面的进行排序

 

问题:怎么取出“-”前面的和后面的?

 

解决:

使用到两个函数:

    substring('ab-cd',4,2)

    --字符串取值,从字符串第4位开始取,取2个

    --返回值cd

 

    charindex('-','ab-cd',1)

    --从“ab-cd”字符串的第1位开始,查找“-”出现的位置角标

    --返回值3

 

部分代码:

--取“-”前的

select tbid,substring(tbid,1,charindex('-',tbid,1)-1),charindex('-',tbid,1) from tb_myname

--取“-”后的

select tbid,substring(tbid,charindex('-',tbid,1)+1,len(tbid)-charindex('-',tbid,1)) from tb_myname

 

--合并在一起

select tbid,substring(tbid,1,charindex('-',tbid,1)-1),substring(tbid,charindex('-',tbid,1)+1,len(tbid)-charindex('-',tbid,1)) from tb_myname

 

3.已将“-”前后都取出,后面只需对这两个列进行排序即可

select tbid from tb_myname

order by substring(tbid,1,charindex('-',tbid,1)-1),

substring(tbid,charindex('-',tbid,1)+1,len(tbid))

 

--注意:看得到的结果集是不是正确的结果?仔细看,不是

--出来的结果是按字符串排序的,而我们的要求是要按“-”前后数值的大小进行排序,因此要将取出来的前后字符串转换成int类型的,然后再排序。

select tbid from tb_myname

order by cast(substring(tbid,1,charindex('-',tbid,1)-1) as int),

cast(substring(tbid,charindex('-',tbid,1)+1,len(tbid)) as int)

 

 

2.面试题二:

编写一个函数,要求能将阿拉伯数字(1,2,3,4,5,6,7,8,9,0)分别替换为(a,b,c,d,e,f,g,h,i,j),非数字全部替换为y,禁止使用replace

--比如,创建个函数,往里面传值'12345',结果返回'abcde'。

 

分析:

输入“12345”,返回“abcde”,显然是要将输入的“12345”一个个截取出来,然后用replace去做替换,然后再拼成一个字符串返回。

但题目要求不能用replace。

 

思路:

(1)将传入的字符串一个个截用substring();

(2)一个个替换,用case when '1' then 'a'……

 

代码:

create function f_my(@sid varchar(66))

returns varchar(66)

as

begin

         declare @i int,@t varchar(6),@newstr varchar(66)

         set @i=1

         set @newstr=''

         while(@i<=len(@sid))

         begin

                  --依次载取一个字符

                  set @t=substring(@sid,@i,1)

                  set @t=case @t when '1' then 'a'

                                   when '2' then 'b'

                                   ……

                                   else 'y'

                          end

                  set @newstr=@newstr+@t

                  set @i=@i+1

         end

         return @newstr

end

 

调用:

select dbo.f_my('123456')

 

3.面试题三:

要求建立多语句表值函数,能将传入的字符串(如‘123456’),生成1列6行记录

 

分析:将传入的‘123456’分别载取出来做为一条记录存入(select into ...)一个新表的列中。

                    sid

 

insert into a

select '2'

 

思路:java中有split()分割方法,sql中没有,自建一个分割函数。

 

代码:

create function f_names(@str varchar(20))

returns @tba table(sa varchar(5))

as

begin

         declare @i int

         set @i=1

         while(@i<=len(@str))

                  begin

                  insert into @tba select substring(@str,@i,1)

                  set @i=@i+1

                  end

         return

end

 

调用:

select * from dbo.f_names('abcdef')

4.面试题四

要求编写函数,要求能将传进来的字符串反序输出,比如'abcdef',要求输出为'fedcba'

 

 

如果大家想浏览我的下一篇文章,请留言

如果觉得我的文章写的好的,请点个赞,或者加关注

版权声明:此文章属于原创,不准随意转载:https://blog.csdn.net/LYQ2332826438

你可能感兴趣的:(数据库,Sql,Server,数据库,文档)