De. Net comment envoyer de nombreux "lots" de SQL à Sql-Server sans beaucoup d'allers-returns?

Nous avons du code qui lit dans un set de files de script SQL, et après avoir effectué un traitement sur eux les divise en lots en trouvant le mot key "GO", puis envoie chaque lot à Sql Server en utilisant un SqlCommon séparé.

Y a-t-il une meilleure façon de faire cela afin que nous:

  • Ne pas avoir autant de voyages aller-return
  • Jamais SQL Server n'attend le prochain lot
  • Cours plus vite.

(Les lots sont principalement constitués de tables, d'index, de vues et de process stockés.La vitesse est un problème car nos tests d'intégration appellent souvent le code.Les outils de ligne commune sql-server ne peuvent pas être installés sur la machine qui exécute ce code.

La solution la plus rapide est en fait la division sur GO. Cependant, une autre alternative consiste à utiliser les objects SMO (SQL Management Objects) et à envoyer le script entier à SQL Server en une seule fois, comme si vous utilisiez Management Studio.

var connectionSsortingng = ConfigurationManager.ConnectionSsortingngs[ connectionSsortingngName ].ConnectionSsortingng; using ( var sqlConnection = new SqlConnection( connectionSsortingng ) ) { var server = new Server( new ServerConnection( sqlConnection ) ); server.ConnectionContext.Connect(); server.ConnectionContext.ExecuteNonQuery( sqlFileContents ); server.ConnectionContext.Disconnect(); } 

Objets de gestion SQL Server (SMO)

2 idées …

Intégrez le script et modifiez-le pour qu'il puisse être exécuté en tant qu'extrait SQL dynamic. Téléchargez le lot entier dans un stream en utilisant nvarchar (max) et exécutez-le en utilisant sp_executesql côté server. Puisque vous le contrôlez pour les tests d'intégration, le SQL dynamic n'est pas vraiment un problème.

Téléchargez le lot entier sur le server en tant que nvarchar (max). Enregistrez le file sur la machine SQL Server en utilisant xp_cmdshell ou CLR ou autre. En utilisant à nouveau xp_cmdshell, utilisez sqlcmd pour exécuter le file de script.

Avec n'importe quel type de traitement par lots, vous perdez un moyen d'identifier exactement où il s'est cassé, puisque vous automatisez les tests d'intégration après tout.