• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    谈谈sqlserver自定义函数与存储过程的区别

    一、自定义函数:

      1. 可以返回表变量
      2. 限制颇多,包括
        不能使用output参数;
        不能用临时表;
        函数内部的操作不能影响到外部环境;
        不能通过select返回结果集;
        不能update,delete,数据库表;
      3. 必须return 一个标量值或表变量
      自定义函数一般用在复用度高,功能简单单一,争对性强的地方。

    二、存储过程

      1. 不能返回表变量
      2. 限制少,可以执行对数据库表的操作,可以返回数据集
      3. 可以return一个标量值,也可以省略return
       存储过程一般用在实现复杂的功能,数据操纵方面。
     
    =========================================================================
    SqlServer存储过程--实例
    实例1:只返回单一记录集的存储过程。
      表银行存款表(bankMoney)的内容如下
     
    Id
    userID
    Sex
    Money
    001
    Zhangsan

    30
    002
    Wangwu

    50
    003
    Zhangsan

    40
     
    要求1:查询表bankMoney的内容的存储过程

    create procedure sp_query_bankMoney
    as
    select * from bankMoney
    go
    exec sp_query_bankMoney

    注* 在使用过程中只需要把T-Sql中的SQL语句替换为存储过程名,就可以了很方便吧!
    实例2(向存储过程中传递参数):

    加入一笔记录到表bankMoney,并查询此表中userID= Zhangsan的所有存款的总金额。

    Create proc insert_bank @param1 char(10),@param2 varchar(20),@param3 varchar(20),@param4 int,@param5 int output
    with encryption ---------加密
    as
    insert into bankMoney (id,userID,sex,Money)
    Values(@param1,@param2,@param3, @param4)
    select @param5=sum(Money) from bankMoney where userID='Zhangsan'
    go
    在SQL Server查询分析器中执行该存储过程的方法是:
    declare @total_price int
    exec insert_bank '004','Zhangsan','男',100,@total_price output
    print '总余额为'+convert(varchar,@total_price)
    go

    在这里再啰嗦一下存储过程的3种传回值(方便正在看这个例子的朋友不用再去查看语法内容):
    1.以Return传回整数
    2.以output格式传回参数
    3.Recordset

    传回值的区别:

    output和return都可在批次程式中用变量接收,而recordset则传回到执行批次的客户端中。
    实例3:使用带有复杂 SELECT 语句的简单过程
      下面的存储过程从四个表的联接中返回所有作者(提供了姓名)、出版的书籍以及出版社。该存储过程不使用任何参数。

    USE pubs
    IF EXISTS (SELECT name FROM sysobjects
         WHERE name = 'au_info_all' AND type = 'P')
      DROP PROCEDURE au_info_all
    GO
    CREATE PROCEDURE au_info_all
    AS
    SELECT au_lname, au_fname, title, pub_name
      FROM authors a INNER JOIN titleauthor ta
       ON a.au_id = ta.au_id INNER JOIN titles t
       ON t.title_id = ta.title_id INNER JOIN publishers p
       ON t.pub_id = p.pub_id
    GO
      au_info_all 存储过程可以通过以下方法执行:
      EXECUTE au_info_all
    -- Or
    EXEC au_info_all
      如果该过程是批处理中的第一条语句,则可使用:
      au_info_all

    实例4:使用带有参数的简单过程

      CREATE PROCEDURE au_info
      @lastname varchar(40),
      @firstname varchar(20)
    AS
    SELECT au_lname, au_fname, title, pub_name
      FROM authors a INNER JOIN titleauthor ta
       ON a.au_id = ta.au_id INNER JOIN titles t
       ON t.title_id = ta.title_id INNER JOIN publishers p
       ON t.pub_id = p.pub_id
      WHERE au_fname = @firstname
       AND au_lname = @lastname
    GO
      au_info 存储过程可以通过以下方法执行:
      EXECUTE au_info 'Dull', 'Ann'
    -- Or
    EXECUTE au_info @lastname = 'Dull', @firstname = 'Ann'
    -- Or
    EXECUTE au_info @firstname = 'Ann', @lastname = 'Dull'
    -- Or
    EXEC au_info 'Dull', 'Ann'
    -- Or
    EXEC au_info @lastname = 'Dull', @firstname = 'Ann'
    -- Or
    EXEC au_info @firstname = 'Ann', @lastname = 'Dull'
      如果该过程是批处理中的第一条语句,则可使用:
      au_info 'Dull', 'Ann'
    -- Or
    au_info @lastname = 'Dull', @firstname = 'Ann'
    -- Or
    au_info @firstname = 'Ann', @lastname = 'Dull'

    实例5:使用带有通配符参数的简单过程

    CREATE PROCEDURE au_info2
    @lastname varchar(30) = 'D%',
    @firstname varchar(18) = '%'
    AS
    SELECT au_lname, au_fname, title, pub_name
    FROM authors a INNER JOIN titleauthor ta
      ON a.au_id = ta.au_id INNER JOIN titles t
      ON t.title_id = ta.title_id INNER JOIN publishers p
      ON t.pub_id = p.pub_id
    WHERE au_fname LIKE @firstname
      AND au_lname LIKE @lastname
    GO
      au_info2 存储过程可以用多种组合执行。下面只列出了部分组合:
      EXECUTE au_info2
    -- Or
    EXECUTE au_info2 'Wh%'
    -- Or
    EXECUTE au_info2 @firstname = 'A%'
    -- Or
    EXECUTE au_info2 '[CK]ars[OE]n'
    -- Or
    EXECUTE au_info2 'Hunter', 'Sheryl'
    -- Or
    EXECUTE au_info2 'H%', 'S%'
      = 'proc2'

    实例6:if...else
    存储过程,其中@case作为执行update的选择依据,用if...else实现执行时根据传入的参数执行不同的修改.

    --下面是if……else的存储过程:
    if exists (select 1 from sysobjects where name = 'Student' and type ='u' )
    drop table Student
    go
    if exists (select 1 from sysobjects where name = 'spUpdateStudent' and type ='p' )
    drop proc spUpdateStudent
    go
    create table Student
    (
    fName nvarchar (10),
    fAge
    smallint ,
    fDiqu varchar (50),
    fTel int
    )
    go
    insert into Student values ('X.X.Y' , 28, 'Tesing' , 888888)
    go
    create proc spUpdateStudent
    (
    @fCase int ,
    @fName nvarchar (10),
    @fAge smallint ,
    @fDiqu varchar (50),
    @fTel int
    )
    as
    update Student
    set fAge = @fAge, -- 传 1,2,3 都要更新 fAge 不需要用 case
    fDiqu = (case when @fCase = 2 or @fCase = 3 then @fDiqu else fDiqu end ),
    fTel = (case when @fCase = 3 then @fTel else fTel end )
    where fName = @fName
    select * from Student
    go
    -- 只改 Age
    exec spUpdateStudent
    @fCase = 1,
    @fName = N'X.X.Y' ,
    @fAge = 80,
    @fDiqu = N'Update' ,
    @fTel = 1010101
    -- 改 Age 和 Diqu
    exec spUpdateStudent
    @fCase = 2,
    @fName = N'X.X.Y' ,
    @fAge = 80,
    @fDiqu = N'Update' ,
    @fTel = 1010101
    -- 全改
    exec spUpdateStudent
    @fCase = 3,
    @fName = N'X.X.Y' ,
    @fAge = 80,
    @fDiqu = N'Update' ,
    @fTel = 1010101
    您可能感兴趣的文章:
    • SqlServer2000+ 身份证合法校验函数的示例代码
    • Sqlserver 自定义函数 Function使用介绍
    • SQLServer行列互转实现思路(聚合函数)
    • SQLSERVER分页查询关于使用Top方式和row_number()解析函数的不同
    • SQLServer中Partition By及row_number 函数使用详解
    • SQLServer中merge函数用法详解
    • sqlserver四舍五入使用round函数及cast和convert函数
    • SQLServer之常用函数总结详解
    上一篇:sql语句中单引号嵌套问题(一定要避免直接嵌套)
    下一篇:深入分析SqlServer查询计划
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    谈谈sqlserver自定义函数与存储过程的区别 谈谈,sqlserver,自定义,函数,