Ausführen großer SQL-Skripte mit GO-Befehlen in C#

Bei der Arbeit mit SQL Server ist es üblich, auf große SQL-Skripte zu stoßen, die mehrere Objekte wie Tabellen, Sichten und gespeicherte Prozeduren erstellen. Oft sind diese Skripte durch GO-Befehle getrennt. Wenn Sie versuchen, solche Skripte aus einem C#-Programm heraus auszuführen, könnten Sie auf ein Problem stoßen: Die Methode SqlCommand.ExecuteNonQuery() erkennt GO-Befehle nicht, was zu Fehlern oder unvollständiger Ausführung Ihrer SQL-Anweisungen führen kann.

Wie können Sie also diese Situation effektiv behandeln? Lassen Sie uns eine Lösung erkunden, die den Prozess vereinfachen kann.

Verständnis des Problems

Die primäre Herausforderung besteht darin, dass die SqlCommand-Klasse von C# GO nicht als Batch-Trennzeichen unterstützt. Jedes Batch muss separat an den Server gesendet werden. Hier ist ein kurzer Überblick über die Schritte, die beim Ausführen eines Skripts mit GO-Befehlen erforderlich sind:

  1. Skriptvorbereitung: Das SQL-Skript wird geschrieben und sollte mehrere Anweisungen enthalten, die durch GO getrennt sind.
  2. Ausführung des SQL-Befehls: Verwenden Sie einen Befehl, um das Skript auszuführen. Wenn Sie jedoch das gesamte Skript direkt ausführen, führt dies aufgrund der Einbeziehung von GO zu Fehlern.
  3. Batch-Ausführung: Teilen Sie das Skript in separate Batches auf, wobei jeder ohne den GO-Befehl ausgeführt wird, und führen Sie sie nacheinander aus.

Das manuelle Trennen des Skripts kann jedoch mühsam und fehleranfällig sein. Glücklicherweise stehen bessere Methoden zur Verfügung.

Eine bessere Lösung: Verwendung von SQL Server Management Objects (SMO)

Eine der effektivsten Methoden zur Ausführung eines großen SQL-Skripts mit GO-Befehlen besteht darin, SQL Server Management Objects (SMO) zu verwenden. SMO erkennt den GO-Trennzeichen und kann die Skripte wie beabsichtigt ausführen.

Implementierungsschritte

So implementieren Sie diese Lösung in Ihrem C#-Programm:

  1. Richten Sie Ihre Umgebung ein: Stellen Sie sicher, dass Ihr Projekt die erforderlichen SMO-Bibliotheken referenziert. Wenn Sie dies noch nicht getan haben, müssen Sie möglicherweise das Paket Microsoft.SqlServer.SqlManagementObjects über NuGet installieren.

  2. Beispielcode: Im Folgenden finden Sie eine Beispielimplementierung für die Ausführung eines SQL-Skripts mit SMO:

public static void Main()    
{        
    // Definieren Sie das Verzeichnis, das die SQL-Skripte enthält
    string scriptDirectory = "c:\\temp\\sqltest\\";
    
    // Definieren Sie die Verbindungszeichenfolge für Ihre SQL Server-Datenbank
    string sqlConnectionString = "Integrierte Sicherheit=SSPI;" +
                                 "Sichere Informationen beibehalten=True;Anfänglicher Katalog=Northwind;Datenquelle=(local)";
    
    // Alle SQL-Dateien aus dem angegebenen Verzeichnis abrufen
    DirectoryInfo di = new DirectoryInfo(scriptDirectory);
    FileInfo[] rgFiles = di.GetFiles("*.sql");
    
    // Durchlaufen Sie jede SQL-Datei
    foreach (FileInfo fi in rgFiles)
    {
        // Den Inhalt der SQL-Datei lesen
        string script = File.ReadAllText(fi.FullName);
        
        // Erstellen Sie eine neue SQL-Verbindung
        using (SqlConnection connection = new SqlConnection(sqlConnectionString))
        {
            // Initialisieren Sie das SMO-Serverobjekt
            Server server = new Server(new ServerConnection(connection));
            server.ConnectionContext.ExecuteNonQuery(script); // Führen Sie das Skript aus
        }
    }
}

Erklärung des Codes

  • Skriptverzeichnis: Ändern Sie die Variable scriptDirectory in den Ordner, in dem Ihre SQL-Dateien gespeichert sind.
  • SQL-Verbindungszeichenfolge: Passen Sie die Verbindungszeichenfolge an die Einstellungen Ihres Datenbankservers an.
  • Dateivorgänge: Der Code verwendet File.ReadAllText, um den Inhalt jeder SQL-Datei zu lesen.
  • SMO-Ausführung: Der Befehl server.ConnectionContext.ExecuteNonQuery(script) führt das Skript aus und verarbeitet dabei korrekt die GO-Befehle.

Alternative Lösungen

Wenn SMO für Ihr Projekt nicht geeignet ist, können Sie auch Folgendes in Betracht ziehen:

  • Bibliothek von Phil Haack: Eine nützliche Bibliothek, die bei der Verarbeitung von SQL-Skripten mit GO-Trennzeichen hilft. Sie können seinen Blogbeitrag hier für Implementierungsdetails nachlesen hier.

Fazit

Das Ausführen großer SQL-Skripte, die GO-Befehle enthalten, muss nicht mühsam sein. Durch die Verwendung von SQL Server Management Objects (SMO) können Sie Ihre Skripte nahtlos in strukturierter Weise ausführen, ohne die Notwendigkeit, Befehle manuell zu trennen. Dieser Ansatz spart nicht nur Zeit, sondern verringert auch das Potenzial für Fehler während der Ausführung.

Für die besten Ergebnisse stellen Sie sicher, dass Ihre Umgebung korrekt eingerichtet ist, und genießen Sie eine reibungslosere SQL-Ausführungserfahrung in Ihren C#-Anwendungen.