Querendo automatizar algumas tarefas em vez de disparar o SSMS para tudo, estou tentando escrever um arquivo em lote para executar essas instruções, que funcionam perfeitamente quando as colo no prompt do sqlcmd. Eles simplesmente verificam o status do espelhamento, suspendem o espelhamento e verificam o status novamente. (Para minimizar as dependências e facilitar a migração de um servidor para outro, desejo manter todos os comandos em um único arquivo.)
select cast(DB_NAME(database_id) as char(30)),
cast(mirroring_state_desc as char(15))
from sys.database_mirroring
where mirroring_state_desc is not null;
go;
ALTER DATABASE db1 SET PARTNER SUSPEND;
ALTER DATABASE db2 SET PARTNER SUSPEND;
go;
select cast(DB_NAME(database_id) as char(30)),
cast(mirroring_state_desc as char(15))
from sys.database_mirroring
where mirroring_state_desc is not null;
go;
Então, escrevi este arquivo em lote:
SETLOCAL ENABLEDELAYEDEXPANSION
SET @SQLSTRING=select cast(DB_NAME(database_id) as char(30)), ^
cast(mirroring_state_desc as char(15)) ^
from sys.database_mirroring ^
where mirroring_state_desc is not null; ^
go ^
^
ALTER DATABASE MSCRM_CONFIG SET PARTNER SUSPEND; ^
ALTER DATABASE XeroxGHSCRMTest_MSCRM SET PARTNER SUSPEND; ^
go ^
^
select cast(DB_NAME(database_id) as char(30)), ^
cast(mirroring_state_desc as char(15)) ^
from sys.database_mirroring ^
where mirroring_state_desc is not null; ^
go
::
echo.
sqlcmd -S AGABQ0VMCRMDB01\PROD_CRM -E -Q "%@SQLSTRING%"
No entanto, ele falha com erros de sintaxe nos comandos "go". Eu tentei "ir" e "ir"; sem sorte.
Qualquer dica ou orientação para fazer este trabalho seria apreciada.
Há alguns problemas com essa abordagem:
O problema imediato é que você não pode continuar uma linha vazia. Portanto, as duas linhas (seguindo cada
go ^
linha) que são apenas o único caractere^
estão fazendo com que a linha termine e não continue. Não tem nada a ver comgo
. Então você pode apenas adicionar um espaço antes da cenoura e construir a string completa.No entanto, mesmo se você corrigir o problema nº 1, ainda ficará com SQL inválido, pois
GO
precisa estar em uma linha por si só ou, no máximo, opcionalmente seguido por algum espaço em branco e um valor INT para quantas vezes repetir o lote anterior ( exGO 12
.). Mas, usando a continuação de linha via^
não haverá nenhum retorno incorporado, então tudo será enviado como uma única linha, e essa não é uma sintaxe válida com osGO
comandos ali.Isso deixa você com duas opções:
Se você estiver enviando SQL que não requer nenhuma separação de lote, apenas se livre dos
GO
comandos (e não faria mal se livrar do@
sinal, e oENABLEDELAYEDEXPANSION
e finalGO
também não são necessários):Se você precisar de separação em lote (por exemplo, se tiver uma
CREATE PROCEDURE
instrução ou algo parecido), poderá criar um arquivo SQL em seu script CMD, adicionar cada linha individualmente e usá-lo como o script SQL que o SQLCMD executará. Isso permite que você incorpore retornos, bem como useGO
comandos:Livre-se do GO completamente. Ele é reconhecido pelo sqlcmd apenas no prompt interativo ou durante a leitura de um arquivo usando a opção -i. Se algumas instruções precisarem estar em um lote separado, use EXEC para agrupá-las. Exemplo: EXEC('CREATE VIEW SomeView')