sql >> Databasteknik >  >> RDS >> Sqlserver

Villkorlig logik i PostDeployment.sql-skriptet med SQLCMD

UPPDATERA

Jag har nu upptäckt att if/else-syntaxen ovan inte fungerar för mig eftersom vissa av mina länkade skript kräver en GO-sats. I huvudsak importerar :r bara skripten inline, så detta blir ogiltig sytax.

Om du behöver en GO-sats i de länkade skripten (som jag gör) så finns det ingen enkel väg runt detta, det slutade med att jag skapade flera skript efter implementeringen och sedan ändrade mitt projekt för att skriva över huvudskriptet efter implementeringen vid byggtid beroende på på byggkonfigurationen. Detta gör nu vad jag behöver, men det verkar som om det borde finnas ett enklare sätt!

För alla som behöver samma sak - Jag tyckte att det här inlägget var användbart

Så i mitt projekt har jag följande filer efter distribution:

  • Script.PostDeployment.sql (tom fil som kommer att ersättas)
  • Default.Script.PostDeployment.sql (länkar till skript som behövs för standarddatakonfiguration)
  • Configuration1.Script.PostDeployment.sql (länkar till skript som behövs för en specifik datakonfiguration)

Jag lade sedan till följande i slutet av projektfilen (högerklicka för att ladda ner och högerklicka sedan på redigera):

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

Slutligen måste du ställa in matchande byggkonfigurationer i lösningen.

Dessutom, för alla som provar andra lösningar, försökte jag också följande utan lycka:

  1. Skapa en post build-händelse för att kopiera filerna istället för att behöva hacka projektfilen XML. Jag kunde inte få det här att fungera eftersom jag inte kunde skapa rätt sökväg till skriptfilen efter distributionen. Det här anslutningsproblemet beskriver problemet

  2. Använda variabler för att skriptsökvägen ska skickas till kommandot :r. Men jag stötte på flera fel med detta tillvägagångssätt.



  1. Hur kontrollerar jag om en MySQL-fråga med det äldre API:et lyckades?

  2. Mysql - välj från flera tabeller utan att producera dubbletter av data

  3. Det går inte att använda None (NULL)-värden i python mysql.connector i förberedd INSERT-sats

  4. Hur man använder pandor för att göra upsert i SqlAlchemy