2010-06-27 3 views
1

Il est possible d'exécuter plusieurs commandes ou scripts SQL à l'aide de OLE DB? Par exemple pour exécuter un script sql pour créer une base de données et sa structure (tables, index, procédures stockées ...). Lorsque j'utilise la classe CCommand, je ne peux exécuter qu'une seule commande. Comment puis-je exécuter un script SQL avec plusieurs commandes?Exécution de plusieurs scripts comman ou sql à l'aide de OLE DB dans SQL Server

Merci, Martin

+1

Est-ce que vous voulez exécuter ceux qui sont au même temps ou l'un après l'autre? – eugeneK

+3

Votre question n'est pas claire. Qu'est-ce que vous essayez de réaliser? Exécuter plusieurs commandes en même temps sur différents threads ou juste plusieurs commandes en utilisant le même objet Command? – eladidan

+0

Je veux exécuter un script avec plusieurs commandes par la suite. –

Répondre

2

Martin - J'ai eu ce même problème. Je suppose que lorsque vous chargez un script avec un ou plusieurs "go", vous obtenez une erreur?

J'ai utilisé SQL DMO dans le passé pour exécuter des scripts avec GO dans ceux-ci. Cela nécessite que SQLDMO soit installé sur votre ordinateur cible.

Une autre option consiste à utiliser la fonction .NET "String.Split (" GO ")" et à boucler le tableau de chaînes résultant, en les exexitant un par un.

Comme ceci:

StreamReader file = File.OpenText("c:\\MyScript.sql"); 
SqlConnection conn = new SqlConnection("My connection string here..."); 
string fullCommand = file.ReadToEnd(); 
string[] splitOptions = new string[] {"go", "GO", "gO", "Go" }; 
foreach (string individualCommand in fullCommand.Split(splitOptions, StringSplitOptions.RemoveEmptyEntries)) 
{ 
    SqlCommand comm = new SqlCommand(individualCommand, conn); 
    comm.ExecuteNonQuery(); 
} 

Disclaimer: Je ne l'ai pas testé le code ci-dessus, mais il devrait vous donner une idée de ce qui est nécessaire :-)

+0

Oui, c'est mon problème. J'utilise C++ et OLE DB, pas ADO .NET mais c'est tout. Je vais essayer. Merci –

+0

@martin - Vous pouvez aussi vérifier que le Go est au début de la ligne afin de réduire le risque qu'il se divise en lots de manière inappropriée (par exemple si vous avez un nom de table contenant la chaîne 'go') - Ou juste utiliser un autre délimiteur moins probable. –

1

J'ai envoyé plusieurs déclarations comme INSERT INTO, INSERT INTO (points-virgules ne sont pas nécessaires dans SQL Server

Certaines déclarations (comme CREATE FUNCTION) doivent être la première déclaration. Dans SSMS et sqlcmd, vous disposez d'un séparateur GO, qui est un outil côté client pour séparer les lots.Ce n'est pas une fonctionnalité OLEDB, vous devez donc les envoyer séparément - dans une invocation séparée en série ou parallèle (selon que vos opérations peuvent être exécutées simultanément)

I Si vous pouvez vous éloigner de CCommand, je suppose que vous pouvez lancer sqlcmd, car il prend en charge les séparateurs de lots GO.

+0

Yup; Je me sépare habituellement avec des points-virgules. Vous pouvez l'utiliser pour mettre en file d'attente des groupes de requêtes «inoffensives» afin de réduire les allers-retours si ce n'est pas un serveur local. –

3

La commande GO qui sépare les instructions TSQL n'est PAS une commande SQL, mais une instruction reconnue par le frontal uniquement. Par conséquent, vous devez scinder explicitement votre script en plusieurs commandes dans "\ nGO" avant de transmettre le résultat à l'objet de commande.

Questions connexes