Question

Lors de l'exécution de SQLCMD.exe et de la fourniture d'arguments de ligne de commande pour les variables de script, les valeurs fournies dans la ligne de commande remplaceront celles définies dans le fichier de script SQL.

par exemple

Étant donné le script SQL suivant:

:setvar XXX "SQL script"
print '$(XXX)'

Et la ligne de commande:

sqlcmd.exe -S <Server> -d <Database> -E -b -i <Script> -v XXX="Batch script"

Je m'attends à ce que le résultat soit:

  

Script par lots

Cependant, le résultat est:

  

Script SQL

Est-ce l'intention ou faut-il supprimer les instructions : setvar du script SQL?

J'ai fourni les instructions : setvar dans un script afin de pouvoir modifier / tester le script dans SQL Management Studio avec le mode SQLCMD, mais d'exécuter les scripts à partir de la ligne de commande dans mes environnements de test et de production. .

Était-ce utile?

La solution

Cela semble être par conception; quelqu'un a déjà émis une demande de modification sur Connect: http://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx ? FeedbackID = 382007

Le seul moyen de résoudre le problème que je vois est de commenter (ou de supprimer autrement) les commandes : setvar lors de la publication.

Autres conseils

Je me débattais aussi avec cela, mais je me souviens d’avoir remarqué que msdeploy.exe était également capable d’exécuter des scripts SQL avec des variables. Mais, pour une raison étrange, msdeploy.exe est capable de transmettre des variables de la ligne de commande avec les valeurs de variable de la ligne de commande ayant la priorité sur les valeurs définies dans le script lui-même.

Un exemple: J'ai un script SQL (NavDbSecurity.sql) qui a trois paramètres définis:

:setvar loginName "testLoginName"
:setvar databaseName "testDatabaseName"
:setvar NavCompanyName "blablabla"

Lorsque j'exécute le script msdeploy suivant, les valeurs de paramètre que je transmets via la ligne de commande ont priorité sur les valeurs définies dans le fichier de script (ne faites pas attention à l'utilisateur sa sans mot de passe;)):

msdeploy.exe -verb:sync -source:dbfullsql="c:\NavDbSecurity.sql" -dest:dbfullsql="data source=.\sqlexpress;initial catalog=data base;User Id=sa;Password=;",transacted=False -setParam:kind=SqlCommandVariable,scope="NavDbSecurity.sql",match=databaseName,value="[data base]" -setParam:kind=SqlCommandVariable,scope="NavDbSecurity.sql",match=loginName,value="domain\user" -setParam:kind=SqlCommandVariable,scope="NavDbSecurity.sql",match=NavCompanyName,value="testCompany"

Essayez de modifier votre fichier sqlproj et ajoutez la propriété suivante

<CommentOutSetVarDeclarations>true</CommentOutSetVarDeclarations>

Les fichiers setvars seront commentés dans le fichier SQL généré. Vous pourrez ensuite utiliser la ligne de commande pour définir la valeur réelle.

Utilisez la commande : r nom de fichier pour vos setvars.

En tant que fichier séparé, vous pouvez utiliser le même fichier fichier parmi vos régions de déploiement, chacune contenant son propre contenu spécifique à une région.

:r path\sqlConfig.sql

Je pense que c'est intentionnel. Actuellement, l'instruction setvar du script .sql a la priorité la plus élevée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top