Gibt es ein Konzept einer "Include-Datei" in SQL Server?

19

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 richtige Reihenfolge aufgeführt sind. Grundsätzlich wie eine Include-Datei aus C ++ oder ASP / VBScript.

Jonathan Allen
quelle

Antworten:

19

Wenn Sie SQLCMD verwenden , können Sie :r FileNameeine separate .sql-Datei hinzufü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 Stapelabschluss festgestellt wurde. Sie können mehrere: r-Befehle ausgeben. Die Datei kann einen beliebigen SQLCMD-Befehl enthalten, einschließlich des in Extras, Optionen definierten Stapelabschlusszeichens. Sie können Folgendes verwenden: r in einem Skript vor oder nach der Bereitstellung, um andere Skripts einzuschließen.

Michael Fredrickson
quelle
Verwenden Sie diese Funktion selbst?
bernd_k
Ich verwende es stark in SQL Server Data Tools-Projekten. Es ist sehr hilfreich, wenn ich versuche, die Beispieldaten zu organisieren, die als Nachskript ausgeführt werden.
Jonathan Allen
4

Im Sinne der alten C-Präprozessoren definitiv nein

  • T-SQL selbst hat kein solches Konzept
  • sqlcmd und sqlcmdmode von SSMS verarbeiten keine relativen Dateipfade
  • sqlcmd und sqlcmdmode von SSMS unterstützen keine bedingten Einschlüsse

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


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

Derzeit bin ich in dieser Situation in meinem Job 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-GUI zu Hause und es ist keine zusätzliche Softwareinstallation erforderlich.

Für ein frisches Design würde ich anfangen, über WPF und PowerShell nachzudenken, um Aufrufe von sqlcmd zu verpacken, aber bei unseren derzeitigen Kunden kann ich nicht davon ausgehen, dass PowerShell V2 vorhanden ist.

In früheren Zeiten haben wir für diesen Zweck einfache Cmd-Stapel geschrieben, von denen einige noch in Gebrauch sind.

Ich denke, es gibt aktuelle Tools, insbesondere für das Targeting von Workflows, die hier geeignet sein könnten. Mit denen kenne ich mich nicht aus.

bernd_k
quelle
3

Neben dem SQLCMD-Modus in Management Studio können Sie auch eine Stapeldatei als Masterdatei 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. Abgesehen davon, dass ich irgendwann lieber Batches ausführen möchte (kein Öffnen von M Studio mehr ... Laden der korrekten Datenbank ... usw.). Ich bevorzuge es, alles im Batch zu konfigurieren, einschließlich der Ausgabedateien.

Marian
quelle
2

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

AK
quelle
+1 - Ich habe so etwas schon mehrmals mit Templating-Tools gemacht. Obwohl sqlcmd einige Möglichkeiten zur Variablensubstitution bietet, würde ich jemandem, der ein anständiges Makro-Präprozessor-Plugin für SSMS implementiert hat, einen großen Kuss auf den Grund geben.
ConcernedOfTunbridgeWells
1
@AK, würde es Ihnen etwas mehr ausmachen, darauf einzugehen? Vielleicht einen Code auf Github posten?
Craig
2

Ich mag die Antwort von bernd_k . Abhängig davon, wie Sie Ihre Skripte benannt haben, z. B. mit 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 in die Abschreibungsliste aufgenommen und durch SQLPS, PowerShell, ersetzt.

Es gibt noch einige andere Optionen.

  1. Richten Sie jedes Skript als einen Schritt in einem SQL Agent-Auftrag 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. Diese Methode gefällt mir, wenn das Ergebnis eines Skripts überprüft werden muss, bevor das nächste ausgeführt wird.
Shawn Melton
quelle
Ich glaube nicht, dass SQLCMD abgeschrieben wird, da es für die Funktionsweise von SQL Server-Datentools und DACPACs so wichtig ist.
Jonathan Allen
@JonathanAllen Wenn Sie eine aktuelle Dokumentation zum Verwalten von DACPACs mit finden, SQLCMDlassen Sie es mich wissen, da das meiste, was ich finde, auf PowerShell verweist . Ich sehe auch nicht die Referenz, wo sqlcmdmit SSDT außer vielleicht für den Schema-Vergleich verwendet wird, aber ich verwende nie die generierten Skripte.
Shawn Melton
SSDT-Skripte sind sqlcmd-Skripte. Auf diese Weise werden sowohl benutzerdefinierte als auch Datenbankparameter behandelt. Wenn Sie den DACPAC mit SqlPackage.exe bereitstellen möchten, zeigt dieser Link, wie Sie sqlcmd-Parameter weitergeben. msdn.microsoft.com/en-us/…
Jonathan Allen