Eu fiz mais algumas pesquisas, então aqui está minha compreensão disso para estender o que foi escrito até agora:
O que é SQLCMD
SQLCMD.exe é um utilitário de console incluído na instalação do SQL Server 2005 e superior. Normalmente, você pode encontrá-lo em um caminho como
c:\Program Files\Microsoft SQL Server\100\Tools\Binn\SQLCMD.EXE
. É um ambiente de script simples que permite a automação de tarefas relacionadas ao SQL Server. Por exemplo, você pode escrever e executar um script que fará login em uma instância específica do SQL Server, executar scripts de um determinado diretório nessa conexão e armazenar a saída em um arquivo especificado.
Invoke-Sqlcmd
O cmdlet foi introduzido com o SQL Server 2008 como um meio de substituir essa ferramenta por uma abordagem padronizada baseada em Powershell, preservando a maior parte da sintaxe e funcionalidade originais. O que é o modo SQLCMD no SSMS
No SSMS, modo SQLCMD é um modo de execução de script que simula o ambiente sqlcmd.exe e, portanto, aceita alguns comandos que não fazem parte da linguagem T-SQL. Ao contrário de
sqlcmd.exe
, ele contata o banco de dados usando SqlClient (da mesma forma que SSMS), não ODBC provedor de dados, portanto, em alguns aspectos, pode ter um comportamento diferente do sqlcmd.exe
. A execução de scripts no modo SQLCMD permite usar comandos típicos de
sqlcmd.exe
meio Ambiente. No entanto, não há suporte para IntelliSense ou depuração para o modo SQLCMD, portanto, manter scripts que misturem T-SQL limpo com código específico do SQLCMD pode ser uma dor de cabeça. Portanto, deve ser usado apenas quando for necessário. Exemplo de caso de uso
Vamos supor que uma empresa tenha uma convenção de nomenclatura para bancos de dados que incluam ambiente no nome, por exemplo:MyDb_Prod , MeuDb_Teste , MeuDb_Desenvolvimento . Esta convenção pode ser usada para minimizar a chance de erros .
Quando um desenvolvedor escreve um script T-SQL, ele terá que ser executado em diferentes ambientes no processo de implantação/teste, o que exigiria muitas versões do código:
SELECT *
FROM [MyDb_Dev].[dbo].[MyTable1] -- MyDb_Dev -> MyDb_Test -> MyDb_Prod
Em vez disso, podemos supor que o nome do banco de dados será fornecido como uma variável SQLCMD no processo de implantação e terá exatamente o mesmo arquivo implantado em todos os ambientes:
-- :setvar databaseName "MyDb_Dev" -- uncomment for testing in SSMS
SELECT *
FROM [$(databaseName)].[dbo].[MyTable1]
(neste exemplo simples, o nome do banco de dados pode ser omitido completamente, mas se você tiver junções entre bancos de dados, é necessário usar o nome do banco de dados)