Participar dos grupos do Whatsapp tem muita coisa ruim (haja treta, gifs, imagens, piadas e etc para suportar), mas tem várias coisas bem boas também. E uma delas diz respeito ao aprendizado diário que a comunidade te proporciona, se você estiver inserido no grupo certo.

Em um dos grupos do WhatsApp que eu participo, surgiu a seguinte pergunta (há um bom tempo, mas só agora resolvi escrever a respeito):

“Alguém poderia me ajudar com script para compactar o backup assim que concluir o bak, usando o 7zip, winrar ou zip?”

Pela pergunta, de imediato, já imaginei que ele estava usando o SQL 2000 ou 2005 e não poderia usar a opção COMPRESSION do backup e sugeri usar o xp_cmdshell (IMHO, uma solução usando powershell e/ou o task scheduler seria muito melhor, mas como nem todo mundo sabe usar ele – apesar de precisar saber – optei pelo xp_cmdshell e seus perigos intrínsecos).

Até que o Edvaldo Castro citou a opção do COMPRESSION e a resposta foi: Já está usando.
Aí você se pergunta: Mas se ele já usa, qual seria o motivo para querer tentar compactar ainda mais o arquivo?
Explico: Ele precisava, também, quebrar esse backup em “N” pedaços, para poder enviar para um outro local e tentar garantir que a transferência não deixe o todo arquivo corrompido, tendo que refazer todo o processo.
Como a compactação já estava sendo realizada, deixar o servidor responsável por mais essa etapa, vai apenas consumir CPU e não vai ter ganho.
Após algumas sugestões, o Edvaldo, novamente, veio com a mágica:

BACKUP DATABASE XXX
to disk= N'C:\TMP\arq1.bak', 
   disk = N'C:\TMP\arq2.bak', 
   disk = N'C:\TMP\arq3.bak', -- etc
WITH COMPRESSION

Isso faz com que o SQL realize essa quebra do arquivo em “N” pedaços, já realizando a compactação, removendo a necessidade de realizar os procedimentos extras.
E o restore?

RESTORE DATABASE XXX
from disk = N'C:\TMP\arq1.bak', 
     disk = N'C:\TMP\arq2.bak', 
     disk = N'C:\TMP\arq3.bak', -- etc

Vejam um exemplo:

/*
Criação da base para teste
*/
create database BackupDividido 
GO
use BackupDividido
go
create table Tbl_Teste (a char(8000))
GO
insert into Tbl_Teste values (REPLICATE('',8000))
GO 100000

Agora, os scripts de backup:

backup database BackupDividido 
to disk = N'C:\Microsoft SQL Server\MSSQL14.SQL2017\MSSQL\Backup\BakupComQuebraECompactado1.bak', 
   disk = N'C:\Microsoft SQL Server\MSSQL14.SQL2017\MSSQL\Backup\BakupComQuebraECompactado2.bak', 
   disk = N'C:\Microsoft SQL Server\MSSQL14.SQL2017\MSSQL\Backup\BakupComQuebraECompactado3.bak'
WITH COMPRESSION

backup database BackupDividido 
to disk = N'C:\Microsoft SQL Server\MSSQL14.SQL2017\MSSQL\Backup\BakupSemQuebraECompactado.bak'
WITH COMPRESSION

backup database BackupDividido 
to disk = N'C:\Microsoft SQL Server\MSSQL14.SQL2017\MSSQL\Backup\BakupComQuebraNaoCompactado1.bak', 
   disk = N'C:\Microsoft SQL Server\MSSQL14.SQL2017\MSSQL\Backup\BakupComQuebraNaoCompactado2.bak', 
   disk = N'C:\Microsoft SQL Server\MSSQL14.SQL2017\MSSQL\Backup\BakupComQuebraNaoCompactado3.bak'

backup database BackupDividido 
to disk = N'C:\Microsoft SQL Server\MSSQL14.SQL2017\MSSQL\Backup\BakupSemQuebraNaoCompactado.bak'

Claro, desta forma, você precisa pré-determinar em quantos arquivos deseja quebrar, mas nada te impede de desenvolver algo que faça esse cálculo e usar isso dinamicamente, caso precise.

Apenas como curiosidade, veja como ficaram os arquivos, com e sem compactação

Como sempre falo, de todas as comunidades que eu já participei, a de SQL Server é a que mais me surpreende, por manter esse espírito de colaboração de forma tão orgânica e natural, que o estranho hoje – para mim – é a pessoa que não faz parte desse mundo.

Vamos participar também?