2009-05-07 12 views
16

Quando si esegue SQLCMD.exe e si forniscono argomenti della riga di comando per le variabili di script, mi aspetto che i valori forniti sulla riga di comando annullino quelli definiti nel file di script SQL.SQLCMD, variabili e script della riga di comando: setvar

ad es.

Dato il seguente script SQL:

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

E la linea di comando:

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

mi aspetto l'uscita di essere:

script batch

Tuttavia l'output è:

script SQL

E 'questo l'intento, o deve essere rimosso le :setvar dichiarazioni nello script SQL?

Ho fornito le istruzioni :setvar nello script, così posso modificare/testare lo script in SQL Management Studio con la modalità SQLCMD, ma eseguire gli script dalla riga di comando nei miei ambienti di test e produzione.

risposta

17

Questo sembra essere di progettazione; qualcuno ha già sollevato una richiesta di modifica su Connect: http://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=382007

L'unico modo per aggirare il problema posso vedere sarebbe quello di commentare (o altrimenti rimuovere) i comandi :setvar sul rilascio.

+5

Che schifo! Grazie – VirtualStaticVoid

+4

Che schifo davvero! Ho notato che il suggerimento su Microsoft Connect è stato aperto nel 2008 ed è ancora attivo. Bene, ho votato comunque, anche se le mie speranze non sono molto alte. –

+0

http://www.codeproject.com/Articles/1019661/Powershell-Scripts-to-Replace-setvar-Variable-in-S – Kody

1

penso che sia intenzionale. attualmente l'istruzione setvar nello script .sql ha la precedenza più alta.

7

Anche io stavo lottando con questo, ma ricordo di aver notato che msdeploy.exe è anche in grado di eseguire script sql con variabili. Ma, per qualche strano motivo, msdeploy.exe è in grado di passare variabili dalla riga di comando con i valori delle variabili dalla riga di comando che hanno la precedenza sui valori definiti nello script stesso.

Un esempio: Ho uno script SQL (NavDbSecurity.sql), che ha tre parametri definiti:

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

Quando eseguire il seguente script msdeploy, i valori dei parametri che passano attraverso la linea di comando prevalgono sulle i valori definiti nel file di script (non importa l'utente sa, senza la password;)):

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

si consiglia di utilizzare il comando :r filename per i vostri SetVars.

Essendo un file separato, è possibile utilizzare lo stesso filenameacross delle regioni di distribuzione contenenti ciascuna il proprio contenuto specifico della regione.

:r path\sqlConfig.sql 
4

provare a modificare il file sqlproj e aggiungere la seguente proprietà

<CommentOutSetVarDeclarations>true</CommentOutSetVarDeclarations> 

Il file SQL generato avrà la SetVars commentata e si può quindi utilizzare la riga di comando per impostare il valore effettivo.

+0

Questo è stato davvero utile, Nella mia build CI ho aggiunto '/ p: CommentOutSetVarDeclarations = True' al comando msbuild e da lì il problema della precedenza non è più un problema. –

Problemi correlati