Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Logique conditionnelle dans le script PostDeployment.sql à l'aide de SQLCMD

MISE À JOUR

J'ai maintenant découvert que la syntaxe if/else ci-dessus ne fonctionne pas pour moi car certains de mes scripts liés nécessitent une instruction GO. Essentiellement, le :r importe simplement les scripts en ligne, ce qui devient une syntaxe invalide.

Si vous avez besoin d'une instruction GO dans les scripts liés (comme je le fais), il n'y a pas de moyen simple de contourner cela, j'ai fini par créer plusieurs scripts de post-déploiement, puis en modifiant mon projet pour écraser le script de post-déploiement principal au moment de la construction en fonction sur la configuration de construction. Cela fait maintenant ce dont j'ai besoin, mais il semble qu'il devrait y avoir un moyen plus simple !

Pour tous ceux qui ont besoin de la même chose - J'ai trouvé ce message utile

Donc, dans mon projet, j'ai les fichiers de post-déploiement suivants :

  • Script.PostDeployment.sql (fichier vide qui sera remplacé)
  • Default.Script.PostDeployment.sql (liens vers les scripts nécessaires pour la configuration standard des données)
  • Configuration1.Script.PostDeployment.sql (liens vers les scripts nécessaires pour une configuration de données spécifique)

J'ai ensuite ajouté ce qui suit à la fin du fichier de projet (clic droit pour décharger puis clic droit pour éditer) :

  <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>

Enfin, vous devrez configurer des configurations de construction correspondantes dans la solution.

De plus, pour ceux qui essaient d'autres solutions, j'ai également essayé ce qui suit sans succès :

  1. Création d'un événement post-construction pour copier les fichiers au lieu d'avoir à pirater le fichier XML du projet. Je n'ai pas pu faire fonctionner cela car je n'ai pas pu former le chemin correct vers le fichier de script de post-déploiement. Ce problème de connexion décrit le problème

  2. Utilisation de variables pour le chemin du script à transmettre à la commande :r. Mais j'ai rencontré plusieurs erreurs avec cette approche.