zoukankan      html  css  js  c++  java
  • SQL SERVER 自定义函数

    SQL SERVER 自定义函数

    标量函数:返回一个标量值

    表格值函数{内联表格值函数、多表格值函数}:返回行集(即返回多个值)

    主要是熟悉具体的语法和常用的函数

    标量函数

    CREATE FUNCTION FUN(@A INT,@B INT)
    RETURNS INT 
    AS 
       BEGIN
         DECLARE @RESULT INT
         SET @RESULT=@A+@B;
         RETURN @RESULT;
       END 
       
     GO
     --调用
      SELECT dbo.FUN(3,2) AS RESULT

    内联表函数

    --表函数  表函数中 
    --内嵌表不需要begin end
    CREATE FUNCTION SHOW()
    RETURNS TABLE
    AS
    RETURN(
       SELECT * FROM STUDENT
       )
     GO
     
     --调用
     SELECT * FROM dbo.SHOW()

    多表格值函数(多表格值函数包含多条sql语句,至少有一条在表变量中填充数据)

    CREATE FUNCTION SHOWMAN()
    RETURNS @TABLE TABLE(ID INT,NAME VARCHAR(100),AGE INT,SEX VARCHAR(10),REMARK VARCHAR(100),PK INT)
    AS
    BEGIN
    INSERT INTO @TABLE  --当函数执行完之后,表变量将被自动删除
    SELECT * FROM STUDENT
    RETURN --直接return 就行了;
    END
    
    
    SELECT * FROM dbo.SHOWMAN()

    查看函数

    --  SELECT * FROM sys.objects WHERE TYPE='FN' AND NAME='ISOUTDATE'

    修改函数

    --将CREATE 变成ALTER 就行了

    删除函数

    --DROP FUNCTION FUNCTION_NAME

    具体实例一

    --判断是否超期;
    
    CREATE FUNCTION ISOUTDATE(@DATE DATETIME)
    RETURNS NVARCHAR(40)
    AS
    BEGIN
          DECLARE @RESULT NVARCHAR(30),
                  @DIFF INT 
                  SET @DIFF=DATEDIFF(DAY,@DATE,GETDATE())-30  --期限是30天
                  
          IF(@DIFF>0)  
          BEGIN  
                --超期了
               
                SET @RESULT='OVER '+CONVERT(VARCHAR(10),@DIFF) +' DAY'
          END
          ELSE
          BEGIN
                --剩余时间
                SET @DIFF=ABS(@DIFF)
                SET @RESULT='REMIAN '+CONVERT(VARCHAR(10),@DIFF)+ ' DAY'
          END
          RETURN (@RESULT)
    END
    
     SELECT dbo.ISOUTDATE('2015-9-1') --  REMIAN 7 DAY
     SELECT dbo.ISOUTDATE('2015-5-1') --  OVER 116 DAY

     具体实例二

    顺便复习,sql转换;
    CONVERT
    CAST
    存在一些隐式转换;

    DECLARE  @A INT, 
             @B INT,
             @C VARCHAR(100)
             SET @A=100;
             SET @B=CAST(@A AS VARCHAR(100))--结果又被隐式转换成int
             SELECT @B+'1'                     -- 结果:101
             --SELECT @B+'S'                   --不可以相加了,s 无法隐式转成int
             SELECT @B+1                       --结果:101
             SET @C=CAST(@A AS VARCHAR(100)) --结果是varchar
             SELECT @C+'1' --                     结果 1011
             SELECT @C+'S' --                     结果:100s
             SELECT @C+ 1  --                     结果:101
             
             --总结: + 字符中中,如果可以隐式转换的就转
             
    --用cast 和 convert 两种装换方式;
    DECLARE @VAR INT,
            @RE  VARCHAR(100)
    SET @VAR=100
    SET @RE=CAST(@VAR AS VARCHAR(100))
    
    SET @RE=CONVERT(INT,@VAR)
    
    --以上两种都是显示的转换,
    --还有一种隐式的转;
    SET @RE=@VAR
    SELECT @RE+'S' --结果100s

      DECLARE @VAR INT
      SET @VAR=100
      -- SELECT STR(@VAR)+'S' --不过它会加上空格
      SELECT CAST(@VAR AS VARCHAR(20))+'S'

     

    这里推荐一篇sqlserver 自定义函数大全

    http://blog.csdn.net/maco_wang/article/details/6261639

  • 相关阅读:
    记: Spring Data Jpa @OneToMany 级联查询被动触发的问题
    后端小白的Bootstrap笔记
    最短路径问题
    深度优先搜索 & 广度优先搜索
    检讨书板子
    关于计时器
    博客园美化
    P4819 杀人游戏 (图论 )
    水站 (二分)
    对拍
  • 原文地址:https://www.cnblogs.com/mc67/p/4826394.html
Copyright © 2011-2022 走看看