Alternativa PowerShell para o SQLCMD
[The English version of this article can be found here]
Estava eu precisando executar um script SQL de ~7GB (backup de tabelas feito como script de inserção através do próprio Management Studio) e, por algum motivo, o utilitário SQLCMD acusava o seguinte erro depois de vários minutos:
Msg 102, Level 15, State 1, Server SRV, Line 1 Incorrect syntax near ...
Depois de procurar o comando exato que estava estourando o erro dentro do arquivo com um editor hexadecimal, concluí que o comando SQL contido no script estava perfeito e que o SQLCMD estava se perdendo de alguma forma. Na impossibilidade de utilizar qualquer outra ferramenta para subir este arquivo, resolvi fazer o meu próprio SQLCMD em PowerShell, que compartilho com vocês agora:
[code language=”powershell”] $filePath = "C:\backup.sql";$stream = [System.IO.File]::OpenText($filePath);
$connection = New-Object System.Data.SqlClient.SqlConnection;
$connection.ConnectionString = "Persist Security Info=True;User ID=user;Password=passwd;Initial Catalog=Restored_Database;Data Source=LPC:.";
$connection.Open();
$command = New-Object System.Data.SqlClient.SqlCommand;
$command.Connection = $connection;
$statement = "";
$statementsProcessed = 0;
$totalBytes = (New-Object System.IO.FileInfo($filePath)).Length;
$bytesProcessed = 0;
while (-not $stream.EndOfStream) {
# Lê a próxima linha.
$line = $stream.ReadLine();
$bytesProcessed += [System.Text.Encoding]::Unicode.GetByteCount($line + [Environment]::NewLine);
# Se trata-se de um GO, executa o comando.
if (($line.Trim() -eq "GO") -or ($line.Trim() -eq "GO;")) {
try {
#$statement;
$command.CommandText = $statement;
[void]$command.ExecuteNonQuery();
$statement = "";
"{0} statements processed ({1:f} MB) – {2:f}%" -f (++$statementsProcessed), ($bytesProcessed / 1024 / 1024), ($bytesProcessed / $totalBytes * 100);
}
catch {
"!!! ERROR !!!";
$Error;
}
}
else {
# Acumula a linha no comando.
$statement += $line + [Environment]::NewLine;
}
}
$stream.Close();
[/code]
Exemplo de saída:
137238 statements processed (544.54 MB) - 7.57% 137239 statements processed (544.55 MB) - 7.57% 137240 statements processed (544.56 MB) - 7.57% 137241 statements processed (544.57 MB) - 7.57% 137242 statements processed (544.58 MB) - 7.57% 137243 statements processed (544.59 MB) - 7.57% 137244 statements processed (544.60 MB) - 7.57% 137245 statements processed (544.61 MB) - 7.57% 137246 statements processed (544.63 MB) - 7.58% 137247 statements processed (544.64 MB) - 7.58% 137248 statements processed (544.65 MB) - 7.58% 137249 statements processed (544.66 MB) - 7.58% 137250 statements processed (544.67 MB) - 7.58% 137251 statements processed (544.68 MB) - 7.58% 137252 statements processed (544.69 MB) - 7.58% 137253 statements processed (544.70 MB) - 7.58% ... 5716545 statements processed (7189.70 MB) - 100.00%