2009-05-07 16 views
16

Al ejecutar SQLCMD.exe y proporcionar argumentos de línea de comandos para variables de scripting, espero que los valores proporcionados en la línea de comandos anulen los definidos en el archivo de script SQL.SQLCMD, variables de línea de comandos y script: setvar

p. Ej.

Dada la siguiente secuencia de comandos SQL:

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

Y la línea de comandos:

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

espero que la salida sea:

escritura de la hornada

Sin embargo, la salida es:

secuencia de comandos SQL

Es esta la intención, o se debe retirar los :setvar declaraciones en la secuencia de comandos SQL?

Proporcioné las instrucciones :setvar en secuencia de comandos, así que puedo editar/probar la secuencia de comandos en SQL Management Studio con modo SQLCMD, pero ejecutar las secuencias de comandos desde la línea de comandos en mis entornos de prueba y producción.

Respuesta

17

Esto parece ser por diseño; alguien ya ha planteado una solicitud de cambio de conexion: http://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=382007

La única manera de evitar el problema que veo sería comentando (o de otra manera eliminar) los comandos :setvar en la liberación.

+5

Eso apesta! Gracias – VirtualStaticVoid

+4

Eso realmente apesta! Noté que la sugerencia sobre Microsoft Connect se abrió en 2008 y todavía está activa. Bueno, lo voté de todos modos, aunque mis esperanzas no son muy altas. –

+0

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

1

Creo que es intencional. Actualmente, la sentencia setvar en el script .sql tiene la precedencia más alta.

7

Tuve problemas con esto también, pero recuerdo haber notado que msdeploy.exe también podía ejecutar scripts sql con variables. Pero, por algún extraño motivo, msdeploy.exe puede pasar variables de la línea de comando con los valores de las variables de la línea de comando que tienen precedencia sobre los valores definidos en el propio script.

Un ejemplo: I tienen una secuencia de comandos SQL (NavDbSecurity.sql) que tiene tres parámetros definidos:

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

Cuando ejecuta la siguiente secuencia de comandos MSDeploy, los valores de los parámetros que pasan a través de la línea de comandos tener prioridad sobre los valores definidos en el archivo de script (no les importa el usuario sa y sin contraseña;)):

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

considerar el uso del comando :r filename para sus SetVars.

Siendo un archivo separado, puede usar el mismo nombre de archivo en las regiones de implementación, cada una de las cuales contiene los contenidos específicos de su región.

:r path\sqlConfig.sql 
4

intentar editar el archivo de sqlproj y añadir la siguiente propiedad

<CommentOutSetVarDeclarations>true</CommentOutSetVarDeclarations> 

El archivo SQL generado tendrá la SetVars comentado y, a continuación, puede utilizar la línea de comandos para establecer el valor real.

+0

Esto fue realmente útil, en mi compilación CI he agregado '/ p: CommentOutSetVarDeclarations = True' al comando msbuild y a partir de ahí el problema de precedencia ya no es un problema. –

Cuestiones relacionadas