Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Bedingte Logik im PostDeployment.sql-Skript mit SQLCMD

AKTUALISIEREN

Ich habe jetzt festgestellt, dass die obige if/else-Syntax für mich nicht funktioniert, da einige meiner verknüpften Skripte eine GO-Anweisung erfordern. Im Wesentlichen importiert :r die Skripte einfach inline, sodass dies zu einer ungültigen Syntax wird.

Wenn Sie (wie ich) eine GO-Anweisung in den verknüpften Skripts benötigen, gibt es keinen einfachen Weg, dies zu umgehen. Am Ende habe ich mehrere Post-Deployment-Skripts erstellt und dann mein Projekt geändert, um das Haupt-Post-Deployment-Skript je nach Erstellungszeit zu überschreiben auf der Build-Konfiguration. Das tut jetzt, was ich brauche, aber es scheint, als sollte es einen einfacheren Weg geben!

Für alle, die dasselbe brauchen - Ich fand diesen Beitrag hilfreich

In meinem Projekt habe ich also die folgenden Post-Deployment-Dateien:

  • Script.PostDeployment.sql (leere Datei, die ersetzt wird)
  • Default.Script.PostDeployment.sql (Links zu Skripten, die für die Standarddatenkonfiguration benötigt werden)
  • Configuration1.Script.PostDeployment.sql (Links zu Skripten, die für eine bestimmte Datenkonfiguration benötigt werden)

Ich habe dann am Ende der Projektdatei Folgendes hinzugefügt (Rechtsklick zum Entladen und dann Rechtsklick zum Bearbeiten):

  <Target Name="BeforeBuild">
      <Message Text="Copy files task running for configuration: $(Configuration)" Importance="high" />
      <Copy Condition=" '$(Configuration)' == 'Release' " SourceFiles="Scripts\Post-Deployment\Default.Script.PostDeployment.sql" DestinationFiles="Scripts\Post-Deployment\Script.PostDeployment.sql" OverwriteReadOnlyFiles="true" />
      <Copy Condition=" '$(Configuration)' == 'Debug' " SourceFiles="Scripts\Post-Deployment\Default.Script.PostDeployment.sql" DestinationFiles="Scripts\Post-Deployment\Script.PostDeployment.sql" OverwriteReadOnlyFiles="true" />
      <Copy Condition=" '$(Configuration)' == 'Configuration1' " SourceFiles="Scripts\Post-Deployment\Configuration1.Script.PostDeployment.sql" DestinationFiles="Scripts\Post-Deployment\Script.PostDeployment.sql" OverwriteReadOnlyFiles="true" />
  </Target>

Schließlich müssen Sie passende Build-Konfigurationen in der Lösung einrichten.

Für alle, die andere Problemumgehungen ausprobieren, habe ich auch Folgendes ohne Erfolg versucht:

  1. Erstellen eines Post-Build-Ereignisses zum Kopieren der Dateien, anstatt die Projektdatei-XML hacken zu müssen. Ich konnte dies nicht zum Laufen bringen, weil ich den richtigen Pfad zur Post-Deployment-Skriptdatei nicht bilden konnte. Dieses Verbindungsproblem beschreibt das Problem

  2. Verwenden von Variablen für den Skriptpfad, der an den Befehl :r übergeben wird. Aber ich bin bei diesem Ansatz auf mehrere Fehler gestoßen.