如何在C#代码中查看带参数的存储过程SQL命令执行语句
查看存储过程调用的完整SQL命令实现方案
要在你的代码中获取调用存储过程时带参数的完整执行语句,可以通过手动拼接存储过程调用语句和参数值的方式实现,具体修改如下:
实现步骤
在创建sqlCmd并设置超时后,添加代码拼接完整SQL语句并输出(可用于调试或日志记录):
private TData ExecuteReturnData<TData>(string procName, Func<IDataReader, TData> translator, SqlConnection sqlCon, params SqlParameter[] parameters) { using var sqlCmd = CreateCommand(procName, sqlCon, parameters); sqlCmd.CommandTimeout = 120; // 生成带参数的完整存储过程执行语句 string fullExecSql; if (sqlCmd.CommandType == CommandType.StoredProcedure) { var paramList = new List<string>(); foreach (SqlParameter param in sqlCmd.Parameters) { string formattedValue; // 根据参数类型格式化值的输出 if (param.Value == DBNull.Value) { formattedValue = "NULL"; } else if (param.DbType is DbType.String or DbType.AnsiString or DbType.DateTime or DbType.DateTime2 or DbType.Date) { // 字符串、日期类型添加单引号,并转义内部单引号避免格式错误 formattedValue = $"'{param.Value.ToString().Replace("'", "''")}'"; } else if (param.DbType == DbType.Boolean) { // 布尔值转换为SQL兼容的1/0 formattedValue = ((bool)param.Value) ? "1" : "0"; } else { // 数字、枚举等直接输出字符串 formattedValue = param.Value.ToString(); } paramList.Add($"@{param.ParameterName} = {formattedValue}"); } fullExecSql = $"EXEC {sqlCmd.CommandText} {string.Join(", ", paramList)}"; } else { fullExecSql = sqlCmd.CommandText; } // 输出完整语句,可替换为日志框架记录 System.Diagnostics.Debug.WriteLine("执行的完整SQL:"); System.Diagnostics.Debug.WriteLine(fullExecSql); using var reader = sqlCmd.ExecuteReader(); var elems = translator(reader); return elems; }
注意事项
- 上述代码仅用于调试或日志记录,不要直接执行拼接后的SQL(存在SQL注入风险);
- 特殊参数类型(如二进制数据、自定义类型)的格式化需要根据实际场景补充处理逻辑;
- 如果只是临时调试,也可以使用SQL Server Profiler或Extended Events工具直接捕获数据库端执行的真实语句,无需修改代码。
内容的提问来源于stack exchange,提问作者Samuel David
相关产品推荐
相关产品推荐

