6

Sto utilizzando Microsoft Data-Tier Application framework per creare uno script di distribuzione basato su un oggetto DacPackage. Sto tentando di utilizzare la classe Microsoft.SqlServer.Management.Smo.Server per eseguire questo script ...ServerConnection.ExecuteNonQuery in modalità SQLCMD

SqlConnection deployConnection = new SqlConnection(connBuilder.ToString()); 
deployConnection.Open(); 
Server server = new Server(new ServerConnection(deployConnection)); 
server.ConnectionContext.ExecuteNonQuery(deployScript); 

Tuttavia, questo errore con ...

Unhandled Exception: Microsoft.SqlServer.Management.Common.ExecutionFailureException: 
    An exception occurred while executing a Transact-SQL statement or batch. ---> 
    System.Data.SqlClient.SqlException: Incorrect syntax near ':'. 

So che la risposta a questo problema è che ho bisogno essere in modalità SQLCMD, ma non so come dire al mio ServerConnection di eseguire in detta modalità.

Indovino che il mio problema non è specifico come quello che dichiaro nel titolo. Quello che devo davvero essere in grado di fare è eseguire lo script generato dal DacPackage tramite il framework .Net. Qualcuno mi può aiutare con questo?

risposta

9

I comandi della modalità SQLCMD sono non Comandi T-SQL; funzionano solo in SQL Server Management Studio (SSMS)/Visual Studio (VS) e SQLCMD.EXE. La modalità SQLCMD è inerentemente come funziona SQLCMD.EXE e può essere abilitato manualmente in SSMS/VS; è una parte di quelle applicazioni e non qualcosa che può essere fatto tramite un provider.

Queste applicazioni interpretano i comandi in modalità SQLCMD e non li inoltrano a SQL Server. I comandi in modalità SQLCMD vengono analizzati/eseguiti per primi (il modo in cui sono in grado di influenzare l'SQL che sta per essere inviato) e quindi la versione finale di SQL viene inviata a SQL Server.

Di conseguenza, gli script SQL di distribuzione generati da SQL Server Data Tools (SSDT) ​​/ Visual Studio devono essere eseguiti tramite uno di questi tre programmi.

Dal momento che si dispone già di un file .dacpac, Microsoft fornisce alcuni modi per pubblicare quelli che si dovrebbe verificare:

è anche possibile creare un pubblicano script SQL tramite DacServices.GenerateDeployScript(), ma questo non cambierà la situazione come si è visto dal momento che lo script pubblicare/distribuire SQL, generate da Visual Studio "Pubblica {} nome_progetto" o GenerateDeployScript(), è lo stesso script Significato, avrà colon-comandi SQLCMD modalità tali da :setvar e :on error exit nonché le variabili SQLCMD-mode, che per lo meno sarà $(DatabaseName) che viene utilizzato nella seguente riga:

USE [$(DatabaseName)]; 

Mentre è possibile commentare le linee :setvar iniziali impostando la proprietà DacDeployOptions di CommentOutSetVarDeclarations su true, lasciando comunque la linea :on error exit e una riga per :setvar __IsSqlCmdEnabled "True" utilizzata per rilevare se la modalità SQLCMD è stata abilitata o meno. Appena sopra questa particolare linea :setvar è un commento affermando:

/* 
Detect SQLCMD mode and disable script execution if SQLCMD mode is not supported. 
To re-enable the script after enabling SQLCMD mode, execute the following: 
SET NOEXEC OFF; 
*/ 

in modo che davvero intendo che questo script viene eseguito solo tramite SQLCMD, sia per mezzo del DOS -> sqlcmd.exe o PowerShell -> Invoke-Sqlcmd.

Tecnicamente, è possibile generare una stringa del contenuto dello script di distribuzione (anziché su un stream) e manipolare quella stringa con a) rimuovendo eventuali comandi di due punti e b) sostituendo "$ (DatabaseName)" con qualsiasi database che si intende implementare in. Tuttavia, non ho provato questo, non sto raccomandando questo, e non sono sicuro che funzionerebbe in tutte le situazioni di quali script di distribuzione potrebbero essere generati da SQL Server Data Tools. Ma sembra come un'opzione.

Inoltre, in minima parte correlato: non è necessario SMO per eseguire gli script SQL. SMO è un mezzo per interagire con SQL Server tramite oggetti piuttosto che direttamente tramite i comandi T-SQL.

EDIT:
Link dove altri hanno provato questo e l'ho trovato non ha funzionato:

possibilità di ottenere lo script SQL pubblicare generato a lavorare programmaticamente:

+0

Quindi non v'è alcun * * modo di eseguire gli script di programmazione sQLCMD generati dal framework .Net - è che quello che stai dicendo? –

+3

@DanForbes: praticamente sì. Niente al di fuori di questi 3 programmi ha alcuna idea di cosa siano quei comandi del colon. MA, ciò non significa che non è possibile avviare un processo in C# per chiamare la riga di comando per "SQLCMD.EXE -S server" e fornire il nome dello script e il flag appropriato per il passaggio in uno script SQL. –

+1

Grazie mille, @srutzky! –

Problemi correlati