记MSSQL 存储过程 debug 方法
从 SSMS 17 开始,您无法调试任何 SQL。
1.存储过程没有办法bug
2.sql 语句太复杂
3.运行存储过程直接报错 定位不到错误 (特别是 那种拼接 成字符串的sql语句 单引号比较多)
解决办法
定义一个@sql
将要执行的sql 语句 赋值给 @sql
然后 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 语句 打印出来 准确定位 错误信息