Avancement d'un script SQL
Salut à tous.
Dans le cadre du développement d'un outil de grosse maintenance ponctuelle de bases de données client, j'ai un script SQL (SQLServer 2017) que j'appelle depuis un code C# :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| using (SqlConnection cnx = CommonTools.GetSqlConnection(databaseNameCible))
{
string scriptFilePath = System.IO.Path.Combine(Environment.CurrentDirectory, "SqlScripts", "mon_script.sql");
string sqlScript = System.IO.File.ReadAllText(scriptFilePath);
using (SqlCommand cmd = new SqlCommand(sqlScript, cnx))
{
cmd.Parameters.Add("@BddCible", SqlDbType.VarChar);
cmd.Parameters["@BddCible"].Value = databaseNameCible;
cmd.Parameters.........
cnx.Open();
cmd.ExecuteNonQuery();
}
} |
Ce script contient plus de 300 requêtes encadrées par une transaction (elle est gérée directement dans le script pour le moment, mais si nécessaire, je devrais pouvoir la déplacer dans le C# au besoin). Sur de très grosses bases il peut prendre plusieurs 10ènes de minutes à s'exécuter entièrement.
NOTA : Je suis pour le moment sur du code synchrone, mais je m'interdis pas de passer sur de l'async/await, voire explicitement des task si besoin.
Afin de faire patienter l'utilisateur et éventuellement alimenter un log, je souhaiterais que ce script puisse me renvoyer régulièrement une information d'avancement.
- Existe-il des instructions à rajouter dans le script sql pour qu'il renvoie régulière, mais immédiatement, pas à la fin de l'exécution, une information pouvant indiquer l'avancement
- comment, coté code C# récupérer cette info (callback, peut-être ?), en temps réel, et non pas uniquement une fois que ExecuteNonQuery rend la main.
Est-ce simplement possible ?
Bon, j'ai toujours une solution un peu barbare, qui serait de découper automatiquement le script et de ne l'exécuter que par blocs de 10% des lignes, en prenant garde à avoir 1 requête=1ligne. Mais je trouve pas ça très "pro", c'est un peu bricole