Clique no banner para conhecer e adquirir o meu treinamento de Bancos de Dados no Azure

SQL Server – Operações com arquivos utilizando xp_cmdshell (Como listar, ler, escrever, copiar, excluir e mover arquivos)

Visualizações: 10.045 views
Tempo de Leitura: 6 minutos

Olá pessoal!

Neste post, vou demonstrar como realizar operações com arquivos utilizando a procedure xp_cmdshell, como copiar arquivos, excluir, renomear, mover, criar diretórios, etc.

Esse post é um complemento de outros de operações com arquivos, utilizando outras soluções:

Para ativar o xp_cmdshell, basta executar o comando abaixo:

stpArquivo_Existe
Stored Procedure que retorna uma variável booleana (BIT) informando se um determinado arquivo ou diretório existe.

Código-fonte

Exemplos de utilização

Verificando se um diretório existe

Verificando se um arquivo existe

stpArquivo_Listar
Stored Procedure que retorna a listagem de arquivos e subdiretórios de um determinado diretório.

Código-fonte

Resultado:

stpArquivo_Ler
Stored Procedure que lê um arquivo de texto e retornar o seu conteúdo em forma de tabela.

Código-fonte

Resultado:

Como vocês devem ter reparado, a importação de arquivos com acentuação não funciona muito bem, pois o comando type do Prompt do DOS, mesmo no Windows em português, não trabalha muito bem com isso. Como alternativa, podemos utilizar o velho conhecido Power Shell.

Código-fonte em Powershell

Resultado:

stpEscreve_Arquivo
Stored Procedure que grava um texto em um arquivo. Devido à uma limitação do Prompt do DOS, não é possível gravar textos com quebras de linhas (para isso, utilize a solução com OLE Automation ou CLR).

Código-fonte

Resultado:

stpApaga_Arquivo
Stored Procedure que exclui um arquivo físicamente no disco ou na rede.

Código-fonte

Resultado apagando um arquivo:

Resultado utilizando caractere curinga:

stpCopia_Arquivo
Stored Procedure que copia um arquivo para um outro diretório, podendo ser local ou na rede.

Código-fonte

Resultado:

stpMove_Arquivo
Stored Procedure que move um arquivo para um outro diretório, podendo ser local ou na rede.

Código-fonte

Resultado:

stpCria_Diretorio
Stored Procedure que cria um diretório em um local especificado.

Código-fonte

Resultado:

stpApaga_Diretorio
Stored Procedure que apaga um diretório, com possibilidade de apagar também arquivos e sub-pastas.

Código-fonte

Resultado:

Como já comentei em alguns posts aqui no blog, não sou nada fã de habilitar e utilizar o xp_cmdshell, uma vez que ele dá “poderes” para qualquer usuário sysadmin da instância executar qualquer comando que o usuário que inicia o serviço do SQL Server possui privilégio, desde um comando dir, até executar delete, format, etc..

Por este motivo, prefiro adotar a utilização do CLR, onde você programa as rotinas utilizando a linguagem de programação C# e o .NET Framework e publica as rotinas na instância. Tanto os usuários sysadmin quanto os usuários normais só conseguem utilizar os métodos implementados na biblioteca CLR, não permitindo a execução de códigos maliciosos que não estejam programados, mas entendo que nem todo DBA quer ter o trabalho de criar bibliotecas em C# e acaba optando por utilizar uma abordagem mais simples, utilizando xp_cmdshell e comandos do DOS e/ou PowerShell.

É isso aí, pessoal!
Espero que tenham gostado desse post e até a próxima.