记 : MSSQL 存储过程 debug 方法

本文介绍了解决MSSQL存储过程调试难题的方法,通过定义变量存储SQL语句并使用PRINT语句输出,有效定位复杂SQL中的错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记MSSQL 存储过程 debug 方法

从 SSMS 17 开始,您无法调试任何 SQL。

1.存储过程没有办法bug

2.sql 语句太复杂

3.运行存储过程直接报错 定位不到错误 (特别是 那种拼接 成字符串的sql语句 单引号比较多)

解决办法
  1. 定义一个@sql

  2. 将要执行的sql 语句 赋值给 @sql

  3. 然后 print(@sql)

搞定
举例子
-- =============================================
-- Author:hwq
-- Create date:20220606
-- Description:查询维修记录
-- =============================================
CREATE PROCEDURE dbo.p_Web_Query_Maintain_ReportAssetMaintenance
@FAgentGUID uniqueidentifier
,@FSelectType int -- 查询类型  0 : 全部 1:维修中 2:L已完成 3:已报废 
,@FStartTime datetime
,@FEndTime datetime
,@FPageSize int
,@FPageIndex int
AS 
BEGIN 
    DECLARE @StartRows int,@EndRows int, @sql nvarchar(max), @StrFAgentGUID nvarchar(max),@prtsql varchar(max)  ;
    SET @StartRows=(@FPageIndex-1)*@FPageSize+1;
    SET @EndRows=@FPageIndex*@FPageSize;
    declare @StrFStartTime varchar(20),@StrFEndTime varchar(20)
    SET @StrFStartTime=CONVERT(varchar(100), @FStartTime, 120)
    SET @StrFEndTime=CONVERT(varchar(100), @FEndTime, 120)
    SET @StrFAgentGUID = CAST(@FAgentGUID AS varchar(36))
    IF @FSelectType =0 
    BEGIN 
       SET @sql = ''; 
    END 
    ELSE 
    BEGIN 
        SET @sql = 'and tram .FMStatus  ='+@FSelectType
    END
--EXEC ('
--          select COUNT(1) FCount from dbo.T_ReportAssetMaintenance   
--            WHERE 
--                FAgentGUID = ''' + @StrFAgentGUID + '''    AND
--               FCreateTime  between  ''' + @StrFStartTime + ''' and ''' + @StrFEndTime + ''' 
--            ' + @sql + '
--
--        ');
--    分页查询
    SET @prtsql= '
            WITH cte AS(
            SELECT   
            tram.FGUID, -- 维修记录id
            tsaa.FName ,-- 所属公司
            tram .FAssetID , -- 设备id
            taat .FAssetTypeName,-- 设备类型
            tram .FFailureCause , -- 故障描述
            tram .FCreateTime ,-- 创建时间
            tram .FRecorder ,-- 创建人
            tram .FImgUrl ,-- 故障图片
            tram .FMStatus ,-- 维修状态
            tram .FMDescribe ,--  维修说明
            tram .FMPerson ,-- 维修人
            tram .FMTime,  -- 维修时间
            ROW_NUMBER() OVER(ORDER BY tram .FCreateTime DESC) AS RowNo
            FROM   T_ReportAssetMaintenance tram 
            LEFT JOIN T_SuperAdminAgent tsaa  ON tram.FAgentGUID = tsaa .FGUID 
            LEFT JOIN T_AdminAsset taa  ON tram .FAssetGUID  = taa.FGUID 
            LEFT JOIN T_AdminAssetType taat  ON taa.FAssetTypeID  = taat.FAssetTypeID 
             WHERE 
                tram.FAgentGUID =''' + @StrFAgentGUID + ''' AND
               tram .FCreateTime  between  ''' + @StrFStartTime + ''' and ''' + @StrFEndTime + ''' 
             ' + @sql + '
            ) SELECT cte.*  FROM cte  
            WHERE  cte.RowNo BETWEEN ' + @StartRows + ' AND ' + @EndRows + ';'
    
    
    
    
    
    PRINT @prtsql;
    
    EXEC (@prtsql )
    
END
报错信息

在这里插入图片描述

总结

通过 print 可以轻松将 sql 语句 打印出来 准确定位 错误信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值