O script precisa testar para ver se já existe uma tabela de backup e parar se existir. Isso é para evitar a substituição de um backup já criado.
O seguinte interromperá a execução do script (mas não a saída de interpretação). No entanto, ele não define o valor do código de saída. Ele precisa definir o valor do código de saída para dar suporte à automação.
Isso precisa funcionar mesmo se o usuário não for sysadmin. Portanto, RAISEERROR() com um código de gravidade > 18 e WITH LOG não melhora a situação.
O script precisa funcionar em sqlcmd.exe e SSMS no SQL Server já em 2012.
IF EXISTS (SELECT 1 FROM BUDB.INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'TABLE_A')
BEGIN
PRINT 'ERROR: Table BUDB.dbo.TABLE_A already exists.'
RAISERROR('ERROR: Will not create existing backup table.', 18, -1);
SET NOEXEC ON;
END
IF EXISTS (SELECT 1 FROM BUDB.INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'TABLE_B')
BEGIN
PRINT 'ERROR: Table BUDB.dbo.TABLE_B already exists.'
RAISERROR('ERROR: Will not create existing backup table.', 18, -1);
SET NOEXEC ON;
END
Você tentou a opção -b do sqlcmd ? Consulte https://learn.microsoft.com/en-us/sql/tools/sqlcmd-utility?view=sql-server-ver16#command-line-options
Primeiro, eu reescreveria o script para usar o
XACT_ABORT_ON
eTRY..CATCH
construir em vez doSET NO EXEC ON
.De acordo com esta recomendação de Erland Sommarskog
Esta é a minha versão do script usado para teste:
Quanto ao SQLCMD existem dois parâmetros:
por padrão, apenas erros com gravidade maior que 10, mas você pode substituir isso com o parâmetro -V .
Aqui está um link para a documentação
A execução do sqlcmd poderia ficar assim