sql >> Base de Datos >  >> RDS >> Sqlserver

Lógica condicional en el script PostDeployment.sql usando SQLCMD

ACTUALIZAR

Ahora descubrí que la sintaxis if/else anterior no funciona para mí porque algunos de mis scripts vinculados requieren una declaración GO. Esencialmente, :r solo importa los scripts en línea, por lo que esto se convierte en una sytax no válida.

Si necesita una declaración GO en las secuencias de comandos vinculadas (como yo), entonces no hay una forma fácil de evitar esto, terminé creando varias secuencias de comandos posteriores a la implementación y luego cambié mi proyecto para sobrescribir la secuencia de comandos principal posterior a la implementación en el momento de la compilación dependiendo en la configuración de compilación. Esto ahora está haciendo lo que necesito, ¡pero parece que debería haber una manera más fácil!

Para cualquiera que necesite lo mismo - Encontré esta publicación útil

Así que en mi proyecto tengo los siguientes archivos posteriores a la implementación:

  • Script.PostDeployment.sql (archivo vacío que será reemplazado)
  • Default.Script.PostDeployment.sql (enlaces a scripts necesarios para la configuración de datos estándar)
  • Configuration1.Script.PostDeployment.sql (enlaces a scripts necesarios para una configuración de datos específica)

Luego agregué lo siguiente al final del archivo del proyecto (haga clic derecho para descargar y luego haga clic derecho en editar):

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

Finalmente, deberá configurar configuraciones de compilación coincidentes en la solución.

Además, para cualquiera que intente otras soluciones, también probé lo siguiente sin suerte:

  1. Crear un evento posterior a la compilación para copiar los archivos en lugar de tener que piratear el archivo XML del proyecto. No pude hacer que esto funcionara porque no pude formar la ruta correcta al archivo de secuencia de comandos posterior a la implementación. Este problema de conexión describe el problema

  2. Uso de variables para que la ruta del script pase al comando :r. Pero me encontré con varios errores con este enfoque.