2017-03-16 2 views
1

J'ai une question qui est très similaire à une de mes anciennes questions Using variable in sql postdeployment build script? Mais maintenant je ne veux pas faire un if/else et avoir le code sql dans mon script publié. Je ne veux pas partager l'information entre les clients.Comment ne pas inclure le contenu du fichier sql lors de la publication?

Alors ... ici va

  • J'ai un projet de base de données dans Visual Studio.
  • J'ai aussi 2 clients avec des besoins différents

Je sais que je peux

  • utilisation script post.deployment pour inclure le contenu des fichiers sql j'ai besoin en définissant un varible dans Project.Properties « . Variables SQLCMD ".

enter image description here

Et puis utiliser comme ça dans Script.PostDeployment.sql

:r ..\$(Customer)Setup.sql 

Là où j'ai 2 fichiers

  • Customer1Setup.sql
  • Customer2Setup.sql

Et puis j'ai défini la variable SQLCMD comme $ (Client) "Client1" ou "Client2" et seulement celui que j'avais mis dans le SQLCMD est inclus.

Mais quand je veux utiliser la variable dans la édition fenêtre celle par défaut l'outrepasse

enter image description here

Je sais que je peux le faire somewho dans un script de compilation mais je veux pour savoir si je peux utiliser les outils actuels et juste créer des fichiers Customer1.publish.xml et Customer2.publish.xml pour que je sache que quelque chose qui est pour Customer1 ne va pas avec le script s'il est publié sur Customer2.

EDIT 1:

Je créé une GitHub repository publique pour tenter de résoudre mon problème. Espérons que quelqu'un puisse jeter un coup d'œil et l'éditer pour travailler.

EDIT 2:

Ceci est le résultat de mon projet de test (comme mon vrai) où dans chacun des 3 tests que j'ai là résultat dans le même. Tous les "trucs" dans Customer2/Customer3 sont inclus dans le résultat.Si cela est censé fonctionner il y a un interrupteur ou réglage je suis manquant dans ma configuration (projet de base de données VS2015)

SET NOEXEC ON 
Print 'This print statement should not be in the publishing script if  Customer variable is not customer1' 
print 'Customer1 stuff from Customer1.sql' 
SET NOEXEC OFF 

IF('$(Customer)' <> 'customer2') 
SET NOEXEC ON 
Print 'This print statement should not be in the publishing script if  Customer variable is not customer2' 
print 'Customer2 stuff from Customer2.sql' 
SET NOEXEC OFF 

IF('$(Customer)' <> 'customer3') 
SET NOEXEC ON 
Print 'This print statement should not be in the publishing script if Customer variable is not customer3' 
print 'Customer3 stuff from Customer3.sql' 
SET NOEXEC OFF 

EDIT 3

Donc, si je visualise ce peu mieux C'est ce que Je veux pour obtenir enter image description here

Mais c'est ce que je reçois enter image description here

+0

double possible de [Logique conditionnelle dans le script en utilisant PostDeployment.sql SQLCMD] (http://stackoverflow.com/questions/7151021/conditional-logic-in-postdeployment-sql-script -using-sqlcmd) –

+0

Quel est le problème avec la logique conditionnelle faisant partie du script? –

+0

Comme je l'ai dit dans le chat: Parfois le client obtient le script à installer dans son environnement et ensuite je ne veux pas d'autres choses spécifiques au client dans ce script. J'essaie juste de faire cette solution automatique. Mais je pense que cela pourrait/devrait juste être fait dans un script de construction (Cake?). Mais je trouve un peu étrange que ce ne soit pas intégré dans les outils. Peut-être que je devrais écrire une extension de base de données VS? – Sturla

Répondre

0

Le ci-dessous ne fonctionne pas selon les attentes:

:r ..\$(Customer)Setup.sql 

Au lieu de cela cependant, vous pouvez utiliser la IF ELSE approche:

IF ('$(Customer)'='customer1') 
BEGIN 
    :r .\script_customer1.sql 
END 
IF ('$(Customer)'='customer2') 
BEGIN 
    :r .\script_customer2.sql 
END 

Après un peu plus de recherche que j'ai trouvé similar SO question. Il s'avère que ce qui précède ne fonctionnerait pas si vous utilisez GO dans vos scripts. Donc, pourrait utiliser le ci-dessous:

IF ('$(Customer)'<>'customer1') 
    SET NOEXEC ON 

:r .\script_customer1.sql 
SET NOEXEC OFF 

IF ('$(Customer)'<>'customer2') 
    SET NOEXEC ON 

:r .\script_customer2.sql 
SET NOEXEC OFF 
+0

Ok génial! J'ai cherché et cherché mais n'ai pas trouvé la partie NOEXEC! Je vais essayer cela tout de suite. – Sturla

+0

Ok, cela ne fonctionne pas. Ou au moins, je ne le fais pas correctement. J'ai ajouté un lien vers un rapport public GitHub où vous pouvez tester cela et, si possible, mettre à jour si possible. Je compte sur vous Alex :-) – Sturla

+0

Les deux options de la réponse ont été testées. Avez-vous essayé seulement l'option "Generate Script" et ensuite l'examiner et éventuellement courir dans le studio de gestion sql? –