Ho fatto altre ricerche, quindi ecco la mia comprensione di questo per estendere ciò che è stato scritto finora:
Cos'è SQLCMD
SQLCMD.exe
è un'utilità della console inclusa nell'installazione di SQL Server 2005 e versioni successive. In genere puoi trovarlo in un percorso come c:\Program Files\Microsoft SQL Server\100\Tools\Binn\SQLCMD.EXE
.
È un semplice ambiente di scripting che consente l'automazione delle attività relative al server SQL. Ad esempio, puoi scrivere ed eseguire uno script che accederà a un'istanza specifica di SQL Server, eseguirà script da una determinata directory su questa connessione e memorizzerà l'output in un file specifico.
Invoke-Sqlcmd
cmdlet è stato introdotto con SQL Server 2008 come mezzo per sostituire questo strumento con un approccio standardizzato basato su Powershell, preservando la maggior parte della sintassi e delle funzionalità originali.
Cos'è la modalità SQLCMD in SSMS
In SSMS, modalità SQLCMD è una modalità di esecuzione di script che simula l'ambiente sqlcmd.exe e quindi accetta alcuni comandi che non fanno parte del linguaggio T-SQL. A differenza di sqlcmd.exe
, contatta il database utilizzando SqlClient (allo stesso modo di SSMS), non ODBC fornitore di dati, quindi in alcuni aspetti potrebbe avere un comportamento diverso da sqlcmd.exe
.
L'esecuzione di script in modalità SQLCMD consente di utilizzare i comandi tipici di sqlcmd.exe
ambiente. Tuttavia, non è disponibile il supporto di IntelliSense o di debug per la modalità SQLCMD, quindi mantenere gli script che combinano T-SQL pulito con codice specifico di SQLCMD può essere un problema. Pertanto, dovrebbe essere utilizzato solo quando è necessario.
Esempio di caso d'uso
Supponiamo che un'azienda abbia una convenzione di denominazione per i database che includono l'ambiente nel nome, ad esempio:MyDb_Prod , MyDb_Test , MyDb_Sviluppo . Questa convenzione può essere utilizzata per ridurre al minimo le possibilità di errori .
Quando uno sviluppatore scrive uno script T-SQL, dovrà essere eseguito in ambienti diversi nel processo di distribuzione/test, che richiederebbe molte versioni del codice:
SELECT *
FROM [MyDb_Dev].[dbo].[MyTable1] -- MyDb_Dev -> MyDb_Test -> MyDb_Prod
Invece, possiamo presumere che il nome del database verrà fornito come una variabile SQLCMD nel processo di distribuzione e che lo stesso file verrà distribuito esattamente in tutti gli ambienti:
-- :setvar databaseName "MyDb_Dev" -- uncomment for testing in SSMS
SELECT *
FROM [$(databaseName)].[dbo].[MyTable1]
(in questo semplice esempio il nome del database potrebbe essere omesso del tutto, ma se hai join tra database, è necessario utilizzare il nome del database)