繁体   English   中英

如何用存储过程查看SQL命令执行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM