【问题标题】:Possible to view T-SQL syntax of a stored proc-based SqlCommand?可以查看基于存储过程的 SqlCommand 的 T-SQL 语法吗?
【发布时间】:2010-03-18 20:40:10
【问题描述】:

我想知道是否有人知道在执行之前检索将由 SqlCommand 对象(CommandType 为 StoredProcedure)执行的实际 T-SQL 的方法...

我的方案涉及在实际执行命令之前选择性地将 DB 操作保存到文件或 MSMQ。我的假设是,如果您创建如下所示的 SqlCommand:

Using oCommand As New SqlCommand("sp_Foo")
    oCommand.CommandType = CommandType.StoredProcedure
    oCommand.Parameters.Add(New SqlParameter("@Param1", "value1"))
    oCommand.ExecuteNonQuery()
End Using

它最终会执行一些 T-SQL,例如:

EXEC sp_Foo @Param1 = 'value1'

这个假设正确吗?如果是这样,是否有可能以某种方式检索实际的 T-SQL?我的目标是获得使用 SqlCommand 类的解析、验证等好处,因为无论如何我都会使用它。这可能吗?我会以错误的方式解决这个问题吗?提前感谢您的任何意见!

【问题讨论】:

    标签: .net sql sql-server vb.net ado.net


    【解决方案1】:

    您正在尝试以友好的形式记录 SP 调用及其参数?或者您想保存此文本以便以后将其作为脚本运行?

    我认为您在第二种情况下不走运,因为当您在 CommandType.StoredProcedure 模式下使用 SQLCommand 时,我认为它不会使用 SQL 调用 SP。如果您在 SQL Server 分析器中查看带有 SP“sp_whatever”的 CommandType.StoredProcedure 和带有“EXEC sp_whatever”的 CommandType.Text 之间的区别,它是一个不同的接口 - RPC 接口。我一直认为 ADO.NET 在第一种情况下从未创建过 SQL 字符串。这就是为什么您此时不必担心注入的原因,因为参数总是在带外发送 - 即使您有带有参数化查询的 CommandType.Text。

    看到这个blog post

    如果您尝试记录操作,我想您可以将 SQLCommand 对象传递给您编写的一些通用对象/方法,该对象/方法提取命令文本和所有参数,并将它们以组织良好的文本形式进行记录。

    【讨论】:

    • 啊哈。我属于后一种情况,这就是我所害怕的……将命令对象发送到其他地方并将所有内容都拉回来(或完全不同的方式)并不是什么大不了的事。我只是在想那将是一个超级简单的方法。无论如何,感谢您提供的信息......我应该阅读更多关于 CommandType.StoredProcedure 的内容。谢谢!
    【解决方案2】:

    SQL Profiler 可能在这里有用。如果您可以在运行 Profiler 的情况下在 SSMS 中执行 SP,则可以对其进行设置以查看正在执行的 T-SQL 命令。

    【讨论】:

      【解决方案3】:

      使用 SQL Profiler,连接到服务器,使用 TSQL_SPs 模板(连接到服务器后,您会看到“跟踪属性”框,第四行是您的模板选择)。

      【讨论】:

        猜你喜欢
        • 2011-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-03
        • 2013-05-28
        • 1970-01-01
        • 1970-01-01
        • 2022-12-31
        相关资源
        最近更新 更多