SQL Server - 函数用法

一、简单介绍 

SQL Server自定义函数分为三种类型: 标量函数(Scalar Function)、内嵌表值函数(Inline Function)、多语句表值函数(Multi-Statement Function)。

注意:SQL中,不能declare一个变量来存储筛选出的表,但可以定义一个表变量来分别存储筛选出来的字段。

1、标量函数

    标量函数是对单一值操作,返回单一值。能够使用表达式的地方,就可以使用标量函数。像我们经常使用的left、getdate等,都属于标量函数。系统函数中的标量函数包括:数学函数、日期和时间函数、字符串函数、数据类型转换函数等。

 

2、表值函数

1)内嵌表值函数

    内嵌表值函数的功能相当于一个参数化的视图。它返回的是一个表,内联表值型函数没有由BEGIN-END 语句括起来的函数体。其返回的表由一个位于RETURN 子句中的SELECT 命令段从数据库中筛选出来。

2)多语句表值函数

    多语句表值函数可以看作标量型和内嵌表值型函数的结合体。它的返回值是一个表,但它和标量型函数一样有一个用BEGIN-END 语句括起来的函数体,返回值的表中的数据是由函数体中的语句插入的。由此可见,它可以进行多次查询,对数据进行多次筛选与合并,弥补了内联表值型函数的不足。
————————————————
详请参见:https://blog.csdn.net/qq_36330228/article/details/88917455

 

 二、案例展示

1、查询供应商的情况


  
  
  1. 1.1 内嵌表值函数
  2. -- 查询某指定供应商的情况
  3. CREATE FUNCTION request1_1( @supplier_code nvarchar( 9))
  4. RETURNS TABLE
  5. AS
  6. RETURN
  7. (
  8. SELECT [项目名称], [项目编码], [本期贷方]
  9. FROM CT1
  10. WHERE [供应商档案编码] = @supplier_code
  11. )
  12. GO
  13. -- 调用函数
  14. SELECT dbo.request1_1( '13579')
  15. SELECT [项目名称] From dbo.request1_1( '13579')

  
  
  1. 1.2 多语句表值函数
  2. -- 查询某指定供应商“连续三年应付账款余额是否为0”
  3. CREATE FUNCTION request1_2( @supplier_code nvarchar( 9))
  4. RETURNS @result TABLE (
  5. [ 2019年度期末余额] decimal( 12, 2),
  6. [应付账款连续情况] nvarchar( 50)
  7. )
  8. AS
  9. BEGIN
  10. declare @panduan varchar( 30)
  11. declare @year_one decimal( 12, 2)
  12. declare @year_two decimal( 12, 2)
  13. declare @year_three decimal( 12, 2)
  14. SELECT @year_one = SUM([期末余额]) FROM CT1 WHERE [供应商档案编码] = @supplier_code AND [年份] = YEAR(GETDATE()) GROUP BY [年份]
  15. SELECT @year_two = SUM([期末余额]) FROM CT1 WHERE [供应商档案编码] = @supplier_code AND [年份] = YEAR(GETDATE()) -1 GROUP BY [年份]
  16. SELECT @year_three = SUM([期末余额]) FROM CT1 WHERE [供应商档案编码] = @supplier_code AND [年份] = YEAR(GETDATE()) -2 GROUP BY [年份]
  17. if( @year_one > 0 AND @year_two > 0 AND @year_three > 0)
  18. begin
  19. set @panduan = '该供应商连续三年应付账款余额不为0'
  20. end
  21. else
  22. begin
  23. set @panduan = 'NULL'
  24. end
  25. insert into @result([ 2019年度期末余额],[应付账款连续情况]) values ( @year_one, @panduan)
  26. RETURN
  27. END
  28. GO

2、查询用户的情况 


  
  
  1. 2.1 内嵌表值函数
  2. -- 查询[已关联用户]中含有特定字样的用户整体情况
  3. CREATE FUNCTION request2_1( @u_name nvarchar( 6))
  4. RETURNS TABLE
  5. AS
  6. RETURN
  7. (
  8. SELECT [职责名称],[角色编码],[角色名称],[所属组织]
  9. FROM CT2
  10. WHERE [已关联用户] LIKE '%' + @u_name + '%' -- '%'+@u_name+'%':这样才能在函数中正确用like匹配
  11. )

  
  
  1. 2.2 多语句表值函数
  2. -- 查询某特定用户职责设置是否合理
  3. /*
  4. [职责名称]不能同时为:
  5. 1)'SG_FI_ZJGL_001'和'SG_FI_ZJGL_002'
  6. 2)'SG_FI_ZJGL_010'和'SG_FI_ZJGL_011'
  7. 3)'SG_FI_ZJGL_013'和'SG_FI_ZJGL_014'
  8. */
  9. CREATE FUNCTION request2_1( @u_name nvarchar( 6))
  10. RETURNS @result TABLE (
  11. [用户] nvarchar( 6) not null,
  12. [权限分配情况] nvarchar( 10) not null
  13. )
  14. AS
  15. BEGIN
  16. DECLARE @count_001 int
  17. DECLARE @count_002 int
  18. DECLARE @count_010 int
  19. DECLARE @count_011 int
  20. DECLARE @count_013 int
  21. DECLARE @count_014 int
  22. DECLARE @permission nvarchar( 10)
  23. SELECT @count_001 = count( *) FROM CT2 WHERE [已关联用户] LIKE '%' + @u_name + '%' AND [职责名称] = 'SG_FI_ZJGL_001'
  24. SELECT @count_002 = count( *) FROM CT2 WHERE [已关联用户] LIKE '%' + @u_name + '%' AND [职责名称] = 'SG_FI_ZJGL_002'
  25. SELECT @count_010 = count( *) FROM CT2 WHERE [已关联用户] LIKE '%' + @u_name + '%' AND [职责名称] = 'SG_FI_ZJGL_010'
  26. SELECT @count_011 = count( *) FROM CT2 WHERE [已关联用户] LIKE '%' + @u_name + '%' AND [职责名称] = 'SG_FI_ZJGL_011'
  27. SELECT @count_013 = count( *) FROM CT2 WHERE [已关联用户] LIKE '%' + @u_name + '%' AND [职责名称] = 'SG_FI_ZJGL_013'
  28. SELECT @count_014 = count( *) FROM CT2 WHERE [已关联用户] LIKE '%' + @u_name + '%' AND [职责名称] = 'SG_FI_ZJGL_014'
  29. IF( ( @count_001 * @count_002 <> 0) OR ( @count_010 * @count_011 <> 0) OR ( @count_013 * @count_014 <> 0) )
  30. BEGIN
  31. SET @permission = '不合理'
  32. END
  33. ELSE
  34. BEGIN
  35. SET @permission = '合理'
  36. END
  37. INSERT INTO @result([用户], [权限分配情况]) VALUES ( @u_name, @permission)
  38. RETURN
  39. END
  40. GO

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值