[英]How to see SQL command execution with Stored Procedure
我有以下代码块:
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;
using var reader = sqlCmd.ExecuteReader();
var elems = translator(reader);
return elems
}
在这里,我想在 SQL 服务器代码块中查看带有参数的完整 SQL 命令执行。 我怎样才能在这里检查?
你要的东西不存在。 它在任何时候都不存在。 使用参数化查询的全部目的是永远不会将参数数据直接替换为 SQL 命令字符串,因此无法以这种方式查看。
参数化查询不仅仅是简单地以适当的方式对参数数据进行清理或 escaping; 他们隔离了来自命令的数据,因此两者永远不会见面。
也就是说,如果您有以下查询:
SELECT * FROM Users WHERE FirstName= @FirstName
这个参数值:
Samuel
而不是这样的:
SELECT * FROM Users WHERE FirstName = 'Samuel'
参数数据在与 SQL 命令完全不同的块中发送到服务器。 服务器接收这两个部分并做一些更像这样的事情:
DECLARE @FirstName nvarchar(40) = LoadParameterFromClient()
SELECT * FROM Users WHERE FirstName= @FirstName
(注意:实际的机制是 sp_executesql)
但就其价值而言,我倾向于将类似的 C# 代码构造得更像这样:
private IEnumerable<TData> ExecuteReturnData<TData>(string SQL, Func<IDataRecord, TData> translator, Action<SqlParameterCollection> addParams)
{
using var conn = new SqlConnection(" ... "); // My data layer knows about the database I'm using, so I don't need to pass in a conneciton
using var cmd = new SqlCommand(SQL, conn);
if (addParams is object) addParams(cmd.Parameters);
conn.Open();
using var reader = sqlCmd.ExecuteReader();
while (reader.Read())
{
yield return translator(reader);
}
}
然后我会使用与上面类似的示例来调用它,如下所示:
var results = ExecuteReturnData<string>("SELECT FirstName, LastName FROM Users WHERE FirstName=@FirstName",
p => p.Add("@FirstName", SqlDbType.NVarchar,40).Value = "Samuel",
r => r["LastName"] + ", " + r["FirstName"]);
对于更复杂的结果类型,我将在目标类型上使用 static FromSQL(IDataRecord data)
方法,以避免使此 function 调用难以阅读:
var results = ExecuteReturnData<User>("SELECT * FROM Users WHERE FirstName=@FirstName",
p => p.Add("@FirstName", SqlDbType.NVarchar,40).Value = "Samuel",
User.FromSQL);
随着项目的增长,我可能还会将这些方法收集到一个单独的 static 类型中,以避免数据层和客户端代码之间的过度耦合。
当然你也可以用同样的方式运行存储过程:
var results = ExecuteReturnData("exec MyProcedure @Param1, @Param2" ... );
如何用存储过程查看SQL命令执行
我想在 SQL 服务器代码块中看到带有参数的完整 SQL 命令执行。 我怎样才能在这里检查?
在 Visual Studio 中打开 SQL Server Object Explorer > New Connection to SQL Server > Expand Database > Expand Programmatibility > Stored Procedures 并右键单击 Sproc 并选择Debug Procedure 。 您可以单步执行 T-SQL 代码。 但是您不能从听起来像您想要的.Net 代码跳转到T-SQL。
调试过程 > 按 F11 进入存储过程:
参考: https://learn.microsoft.com/en-us/sql/ssms/scripting/transact-sql-debugger?view=sql-server-ver16
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.