【问题标题】:SQL SMO To Execute Batch TSQL ScriptSQL SMO 执行批处理 TSQL 脚本
【发布时间】:2010-11-09 17:52:52
【问题描述】:

我正在使用 SMO 执行批处理 SQL 脚本。在 Management Studio 中,脚本在大约 2 秒内执行。使用以下代码,大约需要 15 秒。

var connectionString = GetConnectionString();
// need to use master because the DB in the connection string no longer exists  
// because we dropped it already
var builder = new SqlConnectionStringBuilder(connectionString) 
{ 
    InitialCatalog = "master" 
};

using (var sqlConnection = new SqlConnection(builder.ToString()))
{
    var serverConnection = new ServerConnection(sqlConnection);
    var server = new Server(serverConnection);

    // hangs here for about 12 -15 seconds
    server.ConnectionContext.ExecuteNonQuery(sql);  
}

该脚本创建一个新数据库并在几个表中插入几千行。生成的数据库大小约为 5MB。

任何人对此有任何经验或对为什么 SMO 运行如此缓慢有什么建议?

【问题讨论】:

  • 我会说这没什么好担心的,15 秒创建一个数据库似乎是合理的。此外,当您在 SSMS 中执行查询时,您是否已经连接到服务器?不同的客户端机器?
  • 同一客户端机器。打开连接似乎不需要这么长时间,只需 ExecuteNonQuery 调用。令人担忧的是,这一步是我们单元测试的 AssemblyInitialize 方法的一部分,因此启动单元测试需要额外的 15 秒是一个真正的烦恼。
  • 有人吗?我真的很想将这些脚本用于我们的单元测试。

标签: c# .net sql-server smo


【解决方案1】:

SMO 在后台做了很多奇怪的 .. 事情,这是您以面向对象的方式处理服务器/数据库对象的能力所付出的代价。
既然你没有使用 SMO 的 OO 功能,那你为什么不完全忽略 SMO,直接通过普通的 ADO 运行脚本呢?

【讨论】:

  • 肯定会这样做,但请记住这是 SQL Management Studio 生成的数据脚本(即多个 GO 语句)。有没有办法可以用普通的 ADO 运行脚本?
  • 是的,只需将所有“GO”替换为“;”你很高兴:)
  • 我通常使用“GO”分割字符串并将每个子字符串作为sql执行。
  • 不错,简单的答案。好东西。
  • 我认为批量执行会有性能改进...去看看。
【解决方案2】:

将记录上传到数据库的最佳和最快方法是通过 SqlBulkCopy。
特别是当您的脚本包含约 1000 条记录时 - 这将显着提高速度。
您需要做一些工作才能将数据放入 DataSet,但这可以使用 DataSet xml 函数轻松完成。

【讨论】:

  • 我肯定会使用批量复制,但这些是在 Management Studio 中通过生成脚本功能生成的脚本。有没有办法我仍然可以将这些脚本与大容量副本一起使用?
  • 很遗憾没有。 SQLBulkCopy 需要数据集作为输入。
猜你喜欢
  • 2015-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 2014-06-02
相关资源
最近更新 更多