【问题标题】:From .net how to I send many “batches” of SQL to Sql-Server without lots of round trips?从 .net 如何在没有大量往返的情况下将许多“批次”SQL 发送到 Sql-Server?
【发布时间】:2011-04-08 10:30:51
【问题描述】:

我们有读取一组 SQL 脚本文件的代码,在对它们进行一些处理后,通过找到“GO”关键字将它们分成批次,然后使用单独的 SqlCommon 将每个批次发送到 Sql Server。

有没有更好的方法来做到这一点,所以我们:

  • 没有那么多往返行程
  • 永远不要让 SQL Server 等待下一批
  • 跑得更快。

(批处理主要是创建表、索引、视图和存储过程。速度是一个问题,因为我们的集成测试经常调用代码。运行此代码的机器上可能没有安装 sql-server 常用线工具.)

【问题讨论】:

  • 往返真的很重要吗?数据库操作?我猜你已经尽可能地安排到每批中了?
  • @Rup,合并批次将花费大量时间手动编辑 SQL。我试图找到一个快速的收获,给我们带来一些好处。

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


【解决方案1】:

2 个想法...

打包脚本并将其修改为可作为动态 SQL sn-p 运行。使用 nvarchar(max) 在流中上传整个批次,并在服务器端使用 sp_executesql 运行它。由于您可以控制它以进行集成测试,因此动态 SQL 并不是什么大问题。

将整个批次作为 nvarchar(max) 上传到服务器。使用 xp_cmdshell 或 CLR 或其他方法将文件保存在 SQL Server 计算机上。再次使用 xp_cmdshell,使用 sqlcmd 运行脚本文件。

对于任何类型的批处理,您都无法准确识别出故障的位置,因为您毕竟是在自动化集成测试。

【讨论】:

  • 了解关于 SQL 的损坏位对我们很有价值,因此我们必须让批处理的“服务器端”处理产生良好的错误。
【解决方案2】:

最快的解决方案实际上是在 GO 上拆分。但是,另一种选择是使用 SQL 管理对象 (SMO) 并一举将整个脚本发送到 SQL Server,就像您使用 Management Studio 一样。

var connectionString = ConfigurationManager.ConnectionStrings[ connectionStringName ].ConnectionString;
using ( var sqlConnection = new SqlConnection( connectionString ) )
{
    var server = new Server( new ServerConnection( sqlConnection ) );
    server.ConnectionContext.Connect();
    server.ConnectionContext.ExecuteNonQuery( sqlFileContents );
    server.ConnectionContext.Disconnect();
}

SQL Server Management Objects (SMO)

【讨论】:

  • 在 GO 上拆分要非常小心:一旦你有包含 GO 行的多行 cmets(即部分注释掉的多批处理脚本),所有的地狱都会崩溃。如果您需要处理此类案件,最好选择 SMO。
  • 关于此答案的另一个注意事项 - 无论您是在 GO 上拆分还是使用 SMO,都会有很多往返:SMO 还分别将每个批次提交给服务器。
猜你喜欢
  • 2011-09-10
  • 1970-01-01
  • 1970-01-01
  • 2011-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-09
相关资源
最近更新 更多