如何将sqlrebuilt索引转换为c#

发布于 2025-02-05 18:34:30 字数 902 浏览 3 评论 0原文

我正在尝试使用数据库查询中的C#运行重建索引,但是我遇到了这个问题吗?有什么想法吗?

这是我在C#中的重建索引查询:

public static string rebuildIndex = "ALTER INDEX ALL @tablename REBUILD PARTITION = @partition_number WITH (ONLINE = ON)";

这是来自相应函数的代码:

static void rebuildIndex(string query,string tablename, int parNumber)
{
    using (SqlCommand cmd = new SqlCommand(query, con))
    {
        cmd.Parameters.AddWithValue("@tablename", tablename);
        cmd.Parameters.AddWithValue("@partition_number", parNumber);
        cmd.ExecuteNonQuery();
    }
}

这是错误msg。

*ERROR yourmessage Incorrect syntax near '@tablename'. [HouseKeep_VC.Program] [1]
System.Data.SqlClient.SqlException (0x80131904): Incorrect syntax near '@tablename'.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)

I am trying to run rebuild index using C# from my database query, but I've encountered this problem? Any ideas?

Here is my rebuild index query in C#:

public static string rebuildIndex = "ALTER INDEX ALL @tablename REBUILD PARTITION = @partition_number WITH (ONLINE = ON)";

Here is the code from the respective function:

static void rebuildIndex(string query,string tablename, int parNumber)
{
    using (SqlCommand cmd = new SqlCommand(query, con))
    {
        cmd.Parameters.AddWithValue("@tablename", tablename);
        cmd.Parameters.AddWithValue("@partition_number", parNumber);
        cmd.ExecuteNonQuery();
    }
}

And here is the error msg.

*ERROR yourmessage Incorrect syntax near '@tablename'. [HouseKeep_VC.Program] [1]
System.Data.SqlClient.SqlException (0x80131904): Incorrect syntax near '@tablename'.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

眼前雾蒙蒙 2025-02-12 18:34:30

您需要将动态SQL用于表名称,它不能被参数化。确保使用定制正确报价名称,

  • 您还应该创建和处置连接,而不是缓存。
  • 您应该明确指定参数类型(和长度)。
static void rebuildIndex(string schemaName, string tablename, int parNumber)
{
    const string rebuildIndex = @"
DECLARE @sql nvarchar(max) = '
  ALTER INDEX ALL ' + QUOTENAME(@schemaName) + '.' + QUOTENAME(@tablename) + '
  REBUILD PARTITION = @partition_number
  WITH (ONLINE = ON);
';

EXEC sp_executesql @sql,
  N'@partition_number int',
  @partition_number = @partition_number;
";

    using (var con = new SqlConnection(YourConString))
    using (var cmd = new SqlCommand(query, con))
    {
        cmd.Parameters.Add("@schemaName", SqlDbType.NVarChar, 128).value = schemaName;
        cmd.Parameters.Add("@tablename", SqlDbType.NVarChar, 128).value = tablename;
        cmd.Parameters.Add("@partition_number", SqlDbType.Int).Value = parNumber;
        con.Open();
        cmd.ExecuteNonQuery();
    }
}

You need to use dynamic SQL for the table name, it cannot be parameterized. Make sure to use QUOTENAME to quote the name correctly

  • You should also create and dispose the connection, rather than caching it.
  • You should specify parameter types (and lengths) explicitly.
static void rebuildIndex(string schemaName, string tablename, int parNumber)
{
    const string rebuildIndex = @"
DECLARE @sql nvarchar(max) = '
  ALTER INDEX ALL ' + QUOTENAME(@schemaName) + '.' + QUOTENAME(@tablename) + '
  REBUILD PARTITION = @partition_number
  WITH (ONLINE = ON);
';

EXEC sp_executesql @sql,
  N'@partition_number int',
  @partition_number = @partition_number;
";

    using (var con = new SqlConnection(YourConString))
    using (var cmd = new SqlCommand(query, con))
    {
        cmd.Parameters.Add("@schemaName", SqlDbType.NVarChar, 128).value = schemaName;
        cmd.Parameters.Add("@tablename", SqlDbType.NVarChar, 128).value = tablename;
        cmd.Parameters.Add("@partition_number", SqlDbType.Int).Value = parNumber;
        con.Open();
        cmd.ExecuteNonQuery();
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文