Si la condición en SQLCMD Script en SQL Database Project -- sql-server campo con visual-studio campo con tsql campo con deployment campo con sqlcmd camp Relacionados El problema

If condition in SQLCMD script in sql database project


1
vote

problema

Español

He creado proyecto de base de datos SQL Server en Visual Studio y me pregunto si es posible usar algo como este

Script pre de implementación

  constants.py0  

Script de implementación posterior

  constants.py111  

ERROR ES: constants.py2

o versión de simplier

  constants.py3  

ERROR ES: constants.py4

Cualquier idea, ¿cuál es su enfoque?

Original en ingles

I created Sql Server Database Project in Visual Studio and i wonder if there is possible to use something like this

pre deployment script

:setvar Environment Production 

post deployment script

IF '$(Environment)' = 'Production' BEGIN     ALTER VIEW [dbo].[vwTable]     AS         SELECT Col1, Col2 FROM Production.database.dbo.Table1     GO END ELSE BEGIN     ALTER VIEW [dbo].[vwTable]     AS         SELECT Col2, Col3, Col4 FROM LinkedServer.Development.database.dbo.Table2     GO END 

error is : Alter view must be the only statement in the batch.

or simplier version

ALTER VIEW [dbo].[vwTable] AS IF '$(Environment)' = 'Production'     SELECT Col1, Col2 FROM Production.database.dbo.Table1 ELSE     SELECT Col2, Col3, Col4 FROM LinkedServer.Development.database.dbo.Table2 GO 

error is : Incorrect syntax near IF. Expecting Select or With

any idea, what is your approach ?

              
         
         

Lista de respuestas

1
 
vote
vote
La mejor respuesta
 

Hay una manera de hacer esto, pero esa información se debe prefabricar primero con:

No hay ¡Peligro Robinson! do  ¡Peligro será Robinson! este!

Las definiciones de su objeto realmente necesitan ser las mismas en todos los entornos. Meta-Data (como en los datos de configuración) puede ser diferente, pero no definiciones de objetos. De lo contrario, usted se está poniendo a sí mismo (sin mencionar a la siguiente persona desafortunada para tomar esto) por fracaso. No es inmainternante. Hay diferencias en el rendimiento, la funcionalidad y la seguridad entre el uso de un servidor vinculado y no el uso de uno. En su configuración actual, cualquier QA realizado contra este código no es válido, ya que ni siquiera está cerca de probar lo mismo en cada entorno.

Pero, es comprensible que haya diferencias específicas para el medio ambiente que deben tratarse. En cuyo caso, debe tener una definición de servidor vinculada diferente en cada entorno. ¿No necesita el servidor vinculado en uno o más entornos? Está bien, simplemente cree un servidor vinculado de "bucle back" que apunte en la instancia de que actualmente está residiendo.


Dicho esto, solo necesita enterrar las definiciones de objetos que requieren su propio lote en un EXEC5 , como el siguiente:

  IF ('$(Environment)' = 'Production') BEGIN     EXEC(N'ALTER VIEW [dbo].[vwTable]            AS            SELECT Col1, Col2            FROM Production.database.dbo.Table1;'); END ELSE BEGIN     EXEC(N'ALTER VIEW [dbo].[vwTable]            AS            SELECT Col2, Col3, Col4            FROM LinkedServer.Development.database.dbo.Table2;'); END;   
 

There is a way to do this, but that info must first be prefaced with:

Don't xc2xa0 Danger Will Robinson! xc2xa0 do xc2xa0 Danger Will Robinson! xc2xa0 this!!

Your object definitions really need to be the same across all environments. Meta-data (as in config data) can be different, but not object definitions. Else you are setting yourself (not to mention the next unlucky person to take this over) up for failure. It is unmaintainable. There are differences in performance, functionality, and security between using a Linked Server and not using one. In your current setup, any QA done against this code is invalid as it isn't even close to testing the same thing in each environment.

BUT, it is understandable that there are environment-specific differences that need to be dealt with. In which case, you should have a different Linked Server definition in each environment. Don't need the Linked Server in one or more environments? That's fine, just create a "loop back" Linked Server that points at the Instance that it is currently residing in.


That said, you just need to bury definitions for objects requiring their own batch in an EXEC, such as the following:

IF ('$(Environment)' = 'Production') BEGIN     EXEC(N'ALTER VIEW [dbo].[vwTable]            AS            SELECT Col1, Col2            FROM Production.database.dbo.Table1;'); END ELSE BEGIN     EXEC(N'ALTER VIEW [dbo].[vwTable]            AS            SELECT Col2, Col3, Col4            FROM LinkedServer.Development.database.dbo.Table2;'); END; 
 
 
1
 
vote

no puedes escribirlo como:

ALTER VIEW [dbo].[vwTable] AS SELECT Col1, Col2 FROM $(Environment).database.dbo.Table1 GO

Debe poder controlar las diferentes columnas también, ya que creo que las variables de comando simplemente implantan un texto en el script antes de que se ejecute.

 

Can't you write it as:

ALTER VIEW [dbo].[vwTable] AS SELECT Col1, Col2 FROM $(Environment).database.dbo.Table1 GO

You should be able to control the different columns too as I believe the command variables just implant text into the script before it runs.

 
 
 
 
1
 
vote

Debe usar Procedure en lugar de View con un parámetro para pasar el entorno. Una declaración name_numbers0 debe ser la primera declaración del lote, por lo que no puede usarlo de esta manera. Incluso si de alguna manera ejecuta la declaración name_numbers111 , no podrá crear un 998877766612 T-SQL 99887776613 SQLCMD` Comandos / Variables. < / p>

El procedimiento puede parecerse al a continuación.

  name_numbers4 

 

You should use Procedure instead of View with a parameter for passing the environment. An ALTER VIEW statement must be the first statement of the batch, so you cannot use it in this way. Even if you somehow execute the ALTER VIEW statement, you will not be able to create a VIEW. As a view is a plainT-SQLand cannot understandSQLCMD` commands/variables.

The procedure may look like the one below.

CREATE PROCEDURE [dbo].[usp_Results_Based_On_Environment] (@pEnvironment varchar(50)) AS BEGIN     IF @pEnvironment = 'Production'         SELECT Col1, Col2 FROM Production.database.dbo.Table1     ELSE         SELECT Col2, Col3, Col4 FROM LinkedServer.Development.database.dbo.Table2 END GO 
 
 
 
 
0
 
vote

no es exactamente lo que quería hacer, pero también me ayudó a resolver el problema. Es posible incluir archivos, pero necesito líneas específicas de comentarios / des comentarios manualmente antes de publicar.

  name_numbers5  

Además, el archivo puede contener muchas sentencias IF ('$(Environment)' = 'Production') BEGIN EXEC(N'ALTER VIEW [dbo].[vwTable] AS SELECT Col1, Col2 FROM Production.database.dbo.Table1;'); END ELSE BEGIN EXEC(N'ALTER VIEW [dbo].[vwTable] AS SELECT Col2, Col3, Col4 FROM LinkedServer.Development.database.dbo.Table2;'); END; 16 .

 

Its not exactly what i wanted to do but it also helped me to solve the issue. It is possible to include files, but i need manually comment/uncomment specific lines before publish.

:r .\included\production.views.script.sql --:r .\included\development.views.script.sql 

also the file can contain many GO statements.

 
 

Relacionados problema

1  Manera de ejecutar los scripts de diferentes carpetas con un archivo de murciélago de una ubicación  ( Way to execute different folders scripts using one bat file from one location ) 
Tengo que ejecutar un grueso de scripts en SQL Server 2008R2. Estos scripts están presentes en muchas carpetas y subfolders. He creado un archivo por lotes pa...

0  Parámetro SQLCMD -V ignorado en PowerShell  ( Sqlcmd v parameter ignored in powershell ) 
He leído la documentación ( utilidad sqlcmd ), pero No puedo obtener sqlcmd 's -v Parámetro para trabajar como se espera. Suponiendo este script de SQL ...

1  Llamar a SQLCMD.EXE en el archivo por lotes usando variables Causas Error: "Argumento inesperado"  ( Calling sqlcmd exe in batch file using variables causes error unexpected argum ) 
En un archivo por lotes de Windows, esto funciona: sqlcmd.exe -b -S xxMySqlServerNamexx -Q "BACKUP DATABASE xxMyDatabaseNamexx TO DISK='d:dataxxMyDatabaseN...

2  Uso de SQLCMD en SQL Server  ( Using sqlcmd in sql server ) 
Esta podría ser una pregunta estúpida, pero estoy aprendiendo sobre SQLCMD y el código para ello. Realmente no entiendo dónde prestar la declaración. Esto e...

1  No se puede ejecutar invoke-sqlcmd en un archivo PS1 pero puede en la consola  ( Cannot run invoke sqlcmd in a ps1 file but can on the console ) 
Actualmente estoy en una máquina con SQL Server 2008 y de acuerdo con esta pregunta ( Cómo ejecutar el archivo .sql usando PowerShell? . He instalado los Snap...

11  Manera más inteligente de usar SQLCMD con llamadas dinámicas  ( Smarter way to use sqlcmd with dynamic calling ) 
Tengo este código SSSQL SQLCMD, que puede iniciar sesión en la base de datos y, en este ajuste, haga una declaración SELECT: :CONNECT czasql-001 SELE...

0  Personaje de escape por $ en SQLCMD  ( Escape character for in sqlcmd ) 
Tengo este error Sqlcmd: Error: Syntax error at line 2 near command '1' Cuando ejecuto el sqlcmd para un script. Cuando reviso el script, encontré que ...

0  ¿Por qué mi archivo de salida de My PowerShell está en blanco?  ( Why is my powershell output file blank ) 
Lo siento, soy nuevo en PowerShell, así que obviamente me falta algo bastante fundamental, pero parece que no puedo resolver esto. Tengo un script de PowerS...

3  PowerShell Invoke-SQLCMD Login falló  ( Powershell invoke sqlcmd login failed ) 
Estoy tratando de ejecutar una consulta de SQL de PowerShell para Windows SQL Server 2008 R2. Parece que el código no puede pasar las credenciales de autentic...

4  ¿El comando BCP proporciona una salida diferente en SQL Server 2005 en comparación con 2008?  ( Bcp command gives different output in sql server 2005 compared to 2008 ) 
He ejecutado dos comandos de BCP idénticos en dos configuraciones diferentes con los mismos datos. máquina A = Windows Vista Machine que ejecuta SQL Serve...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos