Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Lógica condicional no script PostDeployment.sql usando SQLCMD


ATUALIZAÇÃO

Agora descobri que a sintaxe if/else acima não funciona para mim porque alguns dos meus scripts vinculados exigem uma instrução GO. Essencialmente, o :r apenas importa os scripts inline, então isso se torna sytax inválido.

Se você precisar de uma instrução GO nos scripts vinculados (como eu), não há uma maneira fácil de contornar isso, acabei criando vários scripts de pós-implantação e, em seguida, alterando meu projeto para substituir o script principal de pós-implantação no tempo de compilação, dependendo na configuração de compilação. Isso agora está fazendo o que eu preciso, mas parece que deve haver uma maneira mais fácil!

Para quem precisa da mesma coisa - Achei este post útil

Portanto, no meu projeto, tenho os seguintes arquivos de pós-implantação:
  • Script.PostDeployment.sql (arquivo vazio que será substituído)
  • Default.Script.PostDeployment.sql (links para scripts necessários para configuração de dados padrão)
  • Configuration1.Script.PostDeployment.sql (links para scripts necessários para uma configuração de dados específica)

Em seguida, adicionei o seguinte ao final do arquivo do projeto (clique com o botão direito do mouse para descarregar e clique com o botão direito do mouse em 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>

Por fim, você precisará definir as configurações de compilação correspondentes na solução.

Além disso, para quem tenta outras soluções alternativas, também tentei o seguinte sem sorte:

  1. Criando um evento post build para copiar os arquivos em vez de ter que hackear o arquivo XML do projeto. não consegui fazer isso funcionar porque não consegui formar o caminho correto para o arquivo de script de pós-implantação. Este problema de conexão descreve o problema

  2. Usando variáveis ​​para o caminho do script para passar para o comando :r. Mas me deparei com vários erros com essa abordagem.