【问题标题】:C# ado.net stored procedure with recompile hint带有重新编译提示的 C# ado.net 存储过程
【发布时间】:2022-08-21 21:08:57
【问题描述】:

有没有办法在通过 System.Data.SqlClient 执行存储过程时在 C# 中添加OPTION (RECOMPILE)

我在想象中寻找的是

using (SqlConnection sqlConn = new SqlConnection(CONN_STR))
{
    sqlConn.Open();
    using (SqlCommand cmd = new SqlCommand(\"usp_xyz OPTION (RECOMPILE)\", sqlConn))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue(\"x\", x);
        cmd.ExecuteNonQuery();
    }
}
  • 重新编译需要在服务器端指定,而不是客户端(因此服务器知道它不能只是重用执行计划)。
  • SQL 存储过程未编译。存储过程在执行时被解析。
  • @jdweng 那不完全正确。如果存在绑定错误,它们会被解析,但直到运行时才完全绑定。实际的查询计划编译也确实发生在运行时(假设它没有被缓存),但来自解析树,而不是来自裸 SQL 文本。

标签: c# sql-server tsql stored-procedures recompile


【解决方案1】:

是的,您可以使用 EXEC... WITH RECOMPILE 语法,但您必须将其作为临时批处理执行,因此指定所有参数。您不能将其与CommandType.StoredProcedure 一起使用。

using (SqlConnection sqlConn = new SqlConnection(CONN_STR))
{
    sqlConn.Open();
    using (SqlCommand cmd = new SqlCommand("EXEC usp_xyz @x = @x WITH RECOMPILE;", sqlConn))
    {
        cmd.Parameters.Add("@x", SqlDbType.SomeType, SomeLength).Value = x;
        cmd.ExecuteNonQuery();
    }
}

如果你愿意,你可以使用sp_recompile,但这有不同的语义:它不只是为这次运行生成一个新的计划,它为该过程的所有未来运行丢弃旧的计划。

using (SqlConnection sqlConn = new SqlConnection(CONN_STR))
{
    sqlConn.Open();
    using (SqlCommand cmd = new SqlCommand("sp_recompile", sqlConn))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add("@objname", SqlDbType.NVarChar, 776).Value = "dbo.usp_xyz";
        cmd.ExecuteNonQuery();
    }

    using (SqlCommand cmd = new SqlCommand("usp_xyz", sqlConn))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add("@x", SqlDbType.SomeType, SomeLength).Value = x;
        cmd.ExecuteNonQuery();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多