zoukankan      html  css  js  c++  java
  • SQL 函数、存储过程、游标与事务模板

    1.标量函数:结果为一个单一的值,可包含逻辑处理过程。其中不能用getdate()之类的不确定性系统函数.

    --标量值函数
    -- ================================================
    -- Template generated from Template Explorer using:
    -- Create Scalar Function (New Menu).SQL
    --
    -- Use the Specify Values for Template Parameters 
    -- command (Ctrl-Shift-M) to fill in the parameter 
    -- values below.
    --
    -- This block of comments will not be included in
    -- the definition of the function.
    -- ================================================
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:   <Author,,Name>
    -- Create date: <Create Date, ,>
    -- Description: <Description, ,>
    -- =============================================
    CREATE FUNCTION <Scalar_Function_Name, sysname, FunctionName> 
    (
    -- Add the parameters for the function here
    <@Param1, sysname, @p1> <Data_Type_For_Param1, , int>
    )
    RETURNS <Function_Data_Type, ,int>
    AS
    BEGIN
    -- Declare the return variable here
    DECLARE <@ResultVar, sysname, @Result> <Function_Data_Type, ,int>
    
    -- Add the T-SQL statements to compute the return value here
    SELECT <@ResultVar, sysname, @Result> = <@Param1, sysname, @p1>
    
    -- Return the result of the function
    RETURN <@ResultVar, sysname, @Result>
    
    END

    2.内联表值函数:返回值为一张表,仅通过一条SQL语句实现,没有逻辑处理能力.可执行大数据量的查询.

    --内联表值函数
    
    -- ================================================
    -- Template generated from Template Explorer using:
    -- Create Inline Function (New Menu).SQL
    --
    -- Use the Specify Values for Template Parameters 
    -- command (Ctrl-Shift-M) to fill in the parameter 
    -- values below.
    --
    -- This block of comments will not be included in
    -- the definition of the function.
    -- ================================================
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:   <Author,,Name>
    -- Create date: <Create Date,,>
    -- Description: <Description,,>
    -- =============================================
    CREATE FUNCTION <Inline_Function_Name, sysname, FunctionName> 
    ( 
    -- Add the parameters for the function here
    <@param1, sysname, @p1> <Data_Type_For_Param1, , int>, 
    <@param2, sysname, @p2> <Data_Type_For_Param2, , char>
    )
    RETURNS TABLE 
    AS
    RETURN 
    (
    -- Add the SELECT statement with parameter references here
    SELECT 0
    )
    GO

    3.多语句表值函数:返回值为一张表,有逻辑处理能力,但仅能对小数据量数据有效,数据量大时,速度很慢.

    --多语句表值函数
    
    -- ================================================
    -- Template generated from Template Explorer using:
    -- Create Multi-Statement Function (New Menu).SQL
    --
    -- Use the Specify Values for Template Parameters 
    -- command (Ctrl-Shift-M) to fill in the parameter 
    -- values below.
    --
    -- This block of comments will not be included in
    -- the definition of the function.
    -- ================================================
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:   <Author,,Name>
    -- Create date: <Create Date,,>
    -- Description: <Description,,>
    -- =============================================
    CREATE FUNCTION <Table_Function_Name, sysname, FunctionName> 
    (
    -- Add the parameters for the function here
    <@param1, sysname, @p1> <data_type_for_param1, , int>, 
    <@param2, sysname, @p2> <data_type_for_param2, , char>
    )
    RETURNS 
    <@Table_Variable_Name, sysname, @Table_Var> TABLE 
    (
    -- Add the column definitions for the TABLE variable here
    <Column_1, sysname, c1> <Data_Type_For_Column1, , int>, 
    <Column_2, sysname, c2> <Data_Type_For_Column2, , int>
    )
    AS
    BEGIN
    -- Fill the table variable with the rows for your result set
    
    RETURN 
    END
    GO

    4.游标:对多条数据进行同样的操作.如同程序的for循环一样.有几种循环方向控制,一般用FETCH Next.

    --示意性SQL脚本
    
    DECLARE @MergeDate Datetime 
    DECLARE @MasterId Int 
    DECLARE @DuplicateId Int 
    
    SELECT @MergeDate = GetDate() 
    
    
    DECLARE merge_cursor CURSOR FAST_FORWARD FOR SELECT MasterCustomerId, DuplicateCustomerId FROM DuplicateCustomers WHERE IsMerged = 0 
    --定义一个游标对象[merge_cursor]
    --该游标中包含的为:[SELECT MasterCustomerId, DuplicateCustomerId FROM DuplicateCustomers WHERE IsMerged = 0 ]查询的结果.
    
    OPEN merge_cursor 
    --打开游标
    FETCH NEXT FROM merge_cursor INTO @MasterId, @DuplicateId 
    --取数据到临时变量
    WHILE @@FETCH_STATUS = 0 --系统@@FETCH_STATUS = 0 时循环结束
    --做循环处理
    BEGIN 
    EXEC MergeDuplicateCustomers @MasterId, @DuplicateId 
    
    UPDATE DuplicateCustomers 
    SET 
    IsMerged = 1, 
    MergeDate = @MergeDate 
    WHERE 
    MasterCustomerId = @MasterId AND 
    DuplicateCustomerId = @DuplicateId 
    
    FETCH NEXT FROM merge_cursor INTO @MasterId, @DuplicateId 
    --再次取值
    END 
    
    CLOSE merge_cursor 
    --关闭游标
    DEALLOCATE merge_cursor 
    --删除游标

    [说明:游标使用必须要配对,Open--Close,最后一定要记得删除游标.]

    5.事务:当一次处理中存在多个操作,要么全部操作,要么全部不操作,操作失败一个,其他的就全部要撤销,不管其他的是否执行成功,这时就需要用到事务.

    begin tran
    update tableA
    set columnsA=1,columnsB=2
    where RecIs=1
    if(@@ERROR <> 0 OR @@ROWCOUNT <> 1)
    begin
    rollback tran
    raiserror( '此次update表tableA出错!!' , 16 , 1 ) 
    return
    end
    
    insert into tableB (columnsA,columnsB) values (1,2)
    if(@@ERROR <> 0 OR @@ROWCOUNT <> 1)
    begin
    rollback tran
    raiserror( '此次update表tableA出错!!' , 16 , 1 ) 
    return
    end
    
    end
    commit
  • 相关阅读:
    罗尔定理、微分中值定理、广义微分中值定理
    高等数学和数学分析教材推荐及其学习方法浅谈
    音视频下载插件 安装及使用
    win10台式机rtl8188eu(FW 150 UM V2.0)无线网卡无法连接wifi(无法连接到这个网络)
    django模板中的extends和include使用方法
    wordpress中文目录出现“有点尴尬诶!该页无法显示"
    wordpress迁移后登陆时出现Forbidden You don’t have permission to access /wp-login.php on this server
    centos设置开机自启动脚本
    hexo的jacman主题设置语言为英文后偶尔出现中文
    安卓QQ聊天记录导出、备份完全攻略
  • 原文地址:https://www.cnblogs.com/Ren_Lei/p/1794632.html
Copyright © 2011-2022 走看看