设为首页 收藏本站
查看: 476|回复: 0

[经验分享] sql 函数

[复制链接]
发表于 2016-11-7 03:43:59 | 显示全部楼层 |阅读模式
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 users.user_Name from USERS as users where users.user_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




本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhdd1234/archive/2009/10/27/4734789.aspx

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-296599-1-1.html 上篇帖子: sql 优化 下篇帖子: 修改操作系统用户密码,造成SQL Server服务启动失败
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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