2011-04-08 6 views
5

Tenemos un código que lee en un conjunto de archivos de script SQL, y después de hacer un procesamiento en ellos los divide en lotes al encontrar la palabra clave "IR" y luego envía cada lote al servidor Sql utilizando un SqlCommon por separado.De .net ¿cómo enviar muchos "lotes" de SQL al servidor Sql sin muchas vueltas?

¿Hay una mejor manera de hacer esto, así que:

  • NO tiene el mayor número de viajes redondos
  • Nunca tienen SQL Server de espera para el siguiente lote
  • correr más rápido.

(Los lotes crean tablas, índices, vistas y procesos almacenados. La velocidad es un problema ya que nuestras pruebas de integración llaman al código con frecuencia. Las herramientas de línea común sql-server no se pueden instalar en la máquina la ejecución de este código.)

+0

¿Está el de ida y vuelta w.r.t. realmente significativo las operaciones de la base de datos? Supongo que ya has organizado tanto como sea posible en cada lote. – Rup

+0

@Rup, combinar los lotes tomaría mucho tiempo editar manualmente el SQL. Estoy tratando de encontrar una ganancia rápida que nos dé algún beneficio. –

Respuesta

2

La solución más rápida se está dividiendo en GO. Sin embargo, otra alternativa es usar los objetos de administración de SQL (SMO) y enviar toda la secuencia de comandos a SQL Server de una sola vez como si estuviera usando 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)

+0

Tenga mucho cuidado al dividir en GO: tan pronto como tenga comentarios de varias líneas que contengan líneas GO (es decir, secuencias de comandos de lotes múltiples que están parcialmente comentadas) se desatará el infierno. Si necesita manejar este tipo de casos, lo mejor es ir con SMO. – Tao

+0

Otra nota sobre esta respuesta, independientemente de si se divide en GO o usa SMO, ** habrá ** muchos viajes redondos: SMO también envía cada lote al servidor por separado. – Tao

3

2 ideas ...

del paquete del guión y modificarlo para que sea ejecutable como un fragmento de SQL dinámico. Suba todo el lote en una secuencia usando nvarchar (max) y ejecútelo usando sp_executesql en el lado del servidor. Como lo controla para las pruebas de integración, SQL dinámico no es un gran problema.

Carga todo el lote en el servidor como nvarchar (max). Guarde el archivo en el equipo de SQL Server usando xp_cmdshell o CLR u otro. Nuevamente usando xp_cmdshell, use sqlcmd para ejecutar el archivo de script.

Con cualquier tipo de proceso por lotes, se pierde cierta forma de identificar exactamente dónde se rompió, ya que, después de todo, está automatizando las pruebas de integración.

+0

Conocer los bits rotos de SQL es valioso para nosotros, por lo que tendríamos que hacer que el procesamiento "en el lado del servidor" del lote genere buenos errores. –

Cuestiones relacionadas