Sql Server 存储过程使用技巧

1、创建带Try。。。Catch的存储过程模板

Copy下面的代码,然后新建查询,就可以写sql语句,执行完后,一个你自己的存储过程就建立好了!

USE [DB]--设定对应的数据库
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- AUTHOR:
-- DESCRIBE:
-- =============================================
CREATE PROCEDURE [dbo].[UP_InsertJHBData]   --存储过程名
    (
      @CustomerName VARCHAR(50)             --参数
    )
AS 
    BEGIN    
        SET NOCOUNT ON                     --提高性能的,必须要有
        DECLARE @Now DATETIME
        SET @Now = GETDATE()               --所有操作保证统一时间
        
        BEGIN TRY 
        --在这里写SQL
        END TRY
        
        BEGIN CATCH    
            DECLARE @ErrorMessage NVARCHAR(4000) ;
            DECLARE @ErrorSeverity INT ;
            DECLARE @ErrorState INT ;
                   
            SELECT  @ErrorMessage = ERROR_MESSAGE() ,
                    @ErrorSeverity = ERROR_SEVERITY() ,
                    @ErrorState = ERROR_STATE() ;
            PRINT @ErrorMessage 
            RAISERROR(@ErrorMessage,  -- Message text.
                        @ErrorSeverity, -- Severity.
                        @ErrorState     -- State.
                        ) ;
            RETURN -1 ;
        END CATCH
    END

2、创建带事务的存储过程模板

只是将带Try。。。Catch的存储过程的模板中加入了事务的控制,使用类似

USE [DB]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- AUTHOR:
-- DESCRIBE:
-- =============================================
CREATE PROCEDURE [dbo].[UP_InsertJHBData]--存储过程名
--参数
    (
      @CustomerName VARCHAR(50)
    )
--参数
AS 
    BEGIN   
        SET NOCOUNT ON ;--提高性能的,必须要有
        DECLARE @Now DATETIME ;
        SET @Now = GETDATE() ;--所有操作保证统一时间
       
        BEGIN TRY 
           BEGIN TRANSACTION myTrans ;--开始事务
           --在这里写SQL
           COMMIT TRANSACTION myTrans ;--事务提交语句
        END TRY
        
        BEGIN CATCH
            ROLLBACK TRANSACTION myTrans-- 始终回滚事务
            --抛出异常
            DECLARE @ErrorMessage NVARCHAR(4000) ;
            DECLARE @ErrorSeverity INT ;
            DECLARE @ErrorState INT ;
            SELECT  @ErrorMessage = ERROR_MESSAGE() ,
                    @ErrorSeverity = ERROR_SEVERITY() ,
                    @ErrorState = ERROR_STATE() ;
            RAISERROR(@ErrorMessage,  -- Message text.
                 @ErrorSeverity, -- Severity.
                 @ErrorState     -- State.
                 ) ;
        END CATCH
    END

 3、循环模板

在存储过程中,经常会生成一些临时表,然后循环临时表的数据进行处理,以下模板可以帮助伙伴们快速处理此类需求

   --生成带行号的临时表数据,并插入临时表#T_Table中
    SELECT ROW_NUMBER() OVER (ORDER BY ID) AS RowNum,
           NAME 
    INTO #T_Table
    FROM TableName
    
    --获取记录总数
    DECLARE @RecordCount INT = 0    
    SELECT @RecordCount = COUNT(1) FROM #T_Table
                
    DECLARE @CurrRowNum INT = 1        --当前行号
    DECLARE @CurrName VARCHAR(50)    --当前字段
    
    --循环记录            
    WHILE @CurrRowNum <= @RecordCount 
        BEGIN
            --获取当前记录
            SELECT @CurrName = Name FROM #T_Table WHERE RowNum = @CurrRowNum
            
            --自定义sql
            
            SET @CurrRowNum = @CurrRowNum + 1 --到下一条记录
        END

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏乐沙弥的世界

Oracle 测试常用表BIG_TABLE

创建测试用表,DBA经常用到,通常都是基于dba_objects来创建的比较多。本文根据Tom大师的big_table进行了整理,供大家参考。

16820
来自专栏杨建荣的学习笔记

关于reset sequence(r3笔记第85天)

sequence在工作中使用比较频繁,对于Insert中插入的值,如果只需要它能够自动递增,这个时候sequence就派上用场了。 但是既然sequence的值...

31980
来自专栏杨建荣的学习笔记

关于创建视图的问题(48天)

今天开发碰到一个问题,说创建视图的时候老是提示没有权限。 SQL> create view test_view as select *from customer...

33470
来自专栏北京马哥教育

SQL优化之踩过的坑

正看资料看的过瘾,突然收到报警,说服务器负载太高,好吧,登录服务器看看,我擦嘞,还能不能愉快的玩耍了?下面是当时的负载情况 ? 看见mysql使用cpu已经到了...

43360
来自专栏后台日记

Mysql INSERT ON DUPLICATE KEY UPDATE

INSERT ... ON DUPLICATE KEY UPDATE是MySQL insert的一种扩展。当发现有重复的唯一索引(unique key)或者主键...

16530
来自专栏Jerry的SAP技术分享

使用ABAP代码返回S/4HANA Material上维护的Attachment明细

17230
来自专栏白驹过隙

MySQL - MySQL++在c++11环境下接口设计

371100
来自专栏乐沙弥的世界

PL/SQL --> DBMS_DDL包的使用

为了便于建立性能良好的PL/SQL程序,Oracle提供了大量的系统包供使用。Oracle提供的这些包扩展并增强了数据库的一些功能,以及突

12240
来自专栏zingpLiu

python【第十二篇】Mysql基础

数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据。我们也可...

11320
来自专栏林欣哲

MySQL执行计划(explain)分析

这里的索引有auditstatus和productid,可以建立联合索引。但是哪个放左边就要计算区分度。

16640

扫码关注云+社区

领取腾讯云代金券