it-swarm.com.de

Gibt es ein Konzept für eine "Include-Datei" in SQL Server?

Ich habe eine Reihe von Skripten, die in einer bestimmten Reihenfolge ausgeführt werden müssen. Ich möchte eine "Master-Datei" erstellen, in der alle anderen Dateien und ihre korrekte Reihenfolge aufgelistet sind. Grundsätzlich wie eine Include-Datei aus C++ oder ASP/VBScript.

19
Jonathan Allen

Wenn Sie SQLCMD verwenden, können Sie mit :r FileName Eine separate SQL-Datei einfügen.

: r Dateiname

Analysiert zusätzliche T-SQL-Anweisungen und SQLCMD-Befehle aus der durch FileName angegebenen Datei in den Anweisungscache. Dateiname wird relativ zum Startverzeichnis für Visual Studio gelesen. Die Datei wird gelesen und ausgeführt, nachdem ein Batch-Terminator gefunden wurde. Sie können mehrere: r-Befehle ausgeben. Die Datei kann einen beliebigen SQLCMD-Befehl enthalten, einschließlich des Batch-Terminators, der unter Extras, Optionen definiert ist. Sie können: r in einem Skript vor oder nach der Bereitstellung verwenden, um andere Skripte einzuschließen.

19

Im Sinne der alten C Präprozessoren definitiv nein

  • T-SQL selbst hat kein solches Konzept
  • sqlcmd und sqlcmdmode von SSMS verarbeiten nicht relative Dateipfade
  • sqlcmd und sqlcmdmode von SSMS unterstützen kein bedingtes Einschließen

Wenn Sie eine Reihe von Dateien mit bestimmten absoluten Pfaden haben, die Sie in einer bedingungslosen Reihenfolge einschließen möchten, können Sie das Befehlszeilentool sqlcmd oder SSMS im sqlcmdmode verwenden, wie von @mfredrickson und @Marian erwähnt.


Wenn Sie jedoch relative Pfade oder bedingte Includes möchten, müssen Sie einen Wrapper verwenden, der sqlcmd aufruft (oder einen seiner veralteten Vorgänger isql oder osql).

Derzeit bin ich in dieser Situation an meinem Arbeitsplatz und überprüfe und erweitere alte vbs- und hta-Codes. Ich bin nicht ganz glücklich, aber es ist eine pragmatische Entscheidung. Es funktioniert und der Endbenutzer ist mit der hta-Benutzeroberfläche zu Hause und es ist keine zusätzliche Softwareinstallation erforderlich.

Für ein frisches Design würde ich darüber nachdenken, WPF und PowerShell zu verwenden, um Aufrufe von sqlcmd zu verpacken, aber bei unseren derzeitigen Kunden kann ich das Vorhandensein von PowerShell V2 nicht vermuten.

In früheren Zeiten haben wir zu diesem Zweck einfache Cmd-Stapel geschrieben, von denen einige noch verwendet werden.

Ich denke, es gibt aktuelle Tools, insbesondere für Workflows, die hier geeignet sein könnten. Mit denen bin ich nicht vertraut.

4
bernd_k

Zusammen mit dem SQLCMD-Modus in Management Studio können Sie auch eine Batch-Datei als Master-Datei verwenden, um alle Ihre SQL-Dateien mithilfe des SQLCMD-Dienstprogramms anzuordnen und aufzurufen.

Der SQLCMD-Modus ist eine Simulation der Dienstprogrammnutzung im Management Studio, sodass zwischen den Modi kein großer Unterschied besteht. Außer dass ich manchmal lieber Stapel laufen lasse (kein Öffnen von M Studio mehr ... Laden der richtigen Datenbank ... usw.). Ich bevorzuge es, alles im Stapel zu konfigurieren, einschließlich der Ausgabedateien.

3
Marian

Ich stimme zu, ein T-SQL-Präprozessor wird dringend benötigt. Ich habe meine eigene in C # entwickelt, was ungefähr eine Stunde gedauert hat. Neben der Kontrolle über die Reihenfolge der Ausführung von SQL-Skripten kann ich auch Makros verwenden, die wie skalare UDFs aussehen und bequem zu verwenden sind, aber genauso schnell wie Inline-UDFs arbeiten.

2
A-K

Ich mag bernd_k's Antwort. Abhängig davon, wie Sie Ihre Skripts benannt haben, z. B. das Einfügen einer Nummer, kann SQL Server PowerShell (SQLPS) verwendet werden, wenn Sie SQL Server 2008 oder höher ausführen. Selbst wenn Sie SQL 2005 verwenden, können Sie PowerShell und SMO für 2005 verwenden.

Randnotiz: Ich glaube, SQLCMD wird irgendwann auf die Liste der abgeschriebenen SQLCMD gesetzt und durch SQLPS, PowerShell ersetzt.

Es gibt noch einige andere Optionen.

  1. Richten Sie jedes Skript als Schritt in einem SQL Agent-Job ein. Sie können die Reihenfolge festlegen, in der sie ausgeführt werden.
  2. Erstellen Sie ein SSIS-Paket, um jede Datei aufzurufen. Dies kann ein bisschen mehr Kontrolle und ein bisschen mehr Protokollierungsoptionen bieten. Ich mag diese Methode, wenn das Ergebnis eines Skripts vor der Ausführung des nächsten Skripts überprüft werden muss.
2
user507