Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 577|回复: 0

SQL Server抛出异常信息 RAISERROR

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-4-30 17:40:19 | 显示全部楼层 |阅读模式

    用于数据库抛出具体异常信息给程序,示例:
    BEGIN TRY
        /*
        RAISERROR ('Error raised in TRY block.', -- Message text.
                16, -- Severity.
                1 -- State.
               );
        */
        DECLARE @x INT=9;
        DECLARE @y INT =0;
       
        SELECT @x/@y;
    END TRY
    BEGIN CATCH
        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;
    执行后返回信息:


    来一篇参考文章:http://www.cnblogs.com/xugang/archive/2011/04/09/2010216.html
    ----------------------------------------------华丽分割线--------------------------------------------------------------
    再上一个实际工作中的SQL:
    ALTER PROCEDURE [dbo].[UP_ERP_Customer_AddRelations]
    (
        @CusId BIGINT,
        @UserId VARCHAR(100),
        @OpenKey VARCHAR(100),
        @DeviceId VARCHAR(100),
        @IMSI VARCHAR(100),
        @AppFrom VARCHAR(100),
        @AppVer VARCHAR(100),
        @AppType TINYINT,
        @SourceId INT,
        @LoginType VARCHAR(100),

        @UID VARCHAR(100),
        @email VARCHAR(100)
    )
    AS
    BEGIN
        SET NOCOUNT ON;
        DECLARE @flag INT;
       
        BEGIN TRY
            BEGIN TRAN;
       
         IF(OBJECT_ID('tempDB..#temp_AddRelations') IS NOT NULL)
         BEGIN
             DROP TABLE #temp_AddRelations;
         END
       
        CREATE TABLE #temp_AddRelations
        (
            CusId BIGINT,
            UserId VARCHAR(100),
            OpenKey VARCHAR(100),
            DeviceId VARCHAR(100),
            IMSI VARCHAR(100),
            AppFrom VARCHAR(100),
            AppVer VARCHAR(100),
            AppType VARCHAR(50),
            SourceId VARCHAR(10),
            LoginType VARCHAR(100),
            PartnerEmail VARCHAR(100),
            [UID] VARCHAR(100)
        )
       
        INSERT INTO #temp_AddRelations
            SELECT
                    CusId=@CusId,
                    UserId =@UserId,
                    OpenKey =@OpenKey,
                    DeviceId =@DeviceId,
                    IMSI =@IMSI,
                    AppFrom =@AppFrom,
                    AppVer =@AppVer,
                    AppType =@AppType,
                    SourceId =@SourceId,
                    LoginType =@LoginType,
                    PartnerEmail=@email,
                    [UID]=@UID

              
        --操作表ThirdPartyUser
        DECLARE @source INT
        SELECT @source= CASE @LoginType WHEN 'qq' THEN 9 WHEN 'aly' THEN 1 ELSE 0 END
                                   
        MERGE INTO YinTaiCustomer.dbo.ThirdPartyUser th
        USING(
            SELECT CusId,UserId,OpenKey,DeviceId,IMSI,AppFrom,AppVer,AppType,SourceId,LoginType,PartnerEmail,[UID]
            FROM #temp_AddRelations
        ) tt ON tt.OpenKey=th.PartnerUserID AND tt.CusId=th.CustomerID
        WHEN NOT MATCHED THEN
            INSERT VALUES(
                        tt.CusId,
                        tt.OpenKey,
                        tt.PartnerEmail,
                        @source,
                        '','','',0,GETDATE(),0,GETDATE(),'',''
                        );
       
        ----操作表customerDeviceValidate
        IF(@UID IS NOT NULL AND @UID<>'')
        BEGIN
            MERGE INTO YinTaiCustomer.dbo.CustomerDeviceValidate d
            USING(
                SELECT CusId,UserId,OpenKey,DeviceId,IMSI,AppFrom,AppVer,AppType,SourceId,LoginType,PartnerEmail,[UID] FROM #temp_AddRelations
            ) td ON td.[UID]=d.[UID] AND td.CusId=d.CustomerID
            WHEN NOT MATCHED THEN
                INSERT VALUES(
                    td.[UID],
                    td.CusId,
                    td.IMSI,
                    td.DeviceId,
                    td.AppFrom,
                    td.SourceId,
                    GETDATE(),
                    td.AppType,
                    td.AppVer
                    );
        END
       
        --操作表UnionRegister
        MERGE INTO YinTaiCustomer..UnionRegister u
        USING(
            SELECT CusId,UserId,OpenKey,DeviceId,IMSI,AppFrom,AppVer,AppType,SourceId,LoginType,PartnerEmail,[UID] FROM #temp_AddRelations
        ) ut ON ut.PartnerEmail=u.NewAccount
        WHEN NOT MATCHED THEN
        INSERT VALUES
               (
                    NULL,
                    ut.PartnerEmail,
                    NULL,
                    ut.SourceId,
                    NULL,
                    GETDATE(),
                    NULL,
                    NULL,
                    NULL,
                    NULL
               );
       
            SET @flag=1;
           
            COMMIT TRAN;
        END TRY
        BEGIN CATCH
            SET @flag=0;
            ROLLBACK TRAN;
           
            /*定义要返回的异常信息变量*/
            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
        RETURN @flag;
    END
    如果调用此存储过程中出现异常,就能再程序中CATCH到信息:

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-1-22 23:03 , Processed in 0.058064 second(s), 27 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表