Published on

June 28, 2021

Verificando a Existência de Arquivos no SQL Server

Neste artigo, exploraremos o uso do procedimento estendido xp_fileexist no SQL Server e discutiremos métodos alternativos para obter o mesmo resultado.

Introdução

Existem situações em que os administradores de banco de dados precisam verificar se um arquivo específico existe em uma pasta específica por meio do SQL Server. Por exemplo, é necessário verificar a existência de um arquivo de backup na pasta de backup antes de iniciar o processo de backup. Um dos métodos para realizar isso é usando o procedimento estendido xp_fileexist.

É importante observar que o procedimento xp_fileexist não é documentado, portanto, é crucial testá-lo minuciosamente antes de usá-lo em ambientes de banco de dados de produção.

Sintaxe

A sintaxe do procedimento armazenado xp_fileexist é a seguinte:

EXEC xp_fileexist <nome_do_arquivo> [, <file_exists INT> OUTPUT]

O argumento nome_do_arquivo especifica o caminho do arquivo e o nome que precisa ser validado. O parâmetro file_exists é um parâmetro de saída opcional que retorna informações sobre se o arquivo existe no diretório especificado. Um valor de 0 indica que o arquivo não existe, enquanto um valor de 1 indica que o arquivo existe.

Por exemplo, a seguinte consulta valida se o arquivo MDF do banco de dados tempdb existe na pasta especificada. A declaração CASE converte o resultado de saída do procedimento em um texto significativo, retornando “Arquivo Existe” quando o resultado é 1 e “Arquivo Não Existe” caso contrário:

DECLARE @File_Exists INT;
EXEC Master.dbo.xp_fileexist 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\tempdb.mdf', @File_Exists OUT;
SELECT CASE @File_Exists
    WHEN 1 THEN 'Arquivo Existe'
    WHEN 0 THEN 'Arquivo Não Existe'
END AS Resultado;

Além disso, podemos imprimir o resultado do procedimento estendido na guia de mensagens usando a instrução PRINT:

SET NOCOUNT ON;
DECLARE @File_Exists INT;
EXEC Master.dbo.xp_fileexist 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\tempdb.mdf', @File_Exists OUT;
PRINT CASE @File_Exists
    WHEN 1 THEN 'Arquivo Existe'
    WHEN 2 THEN 'Arquivo Não Existe'
END;

Uso Avançado

O procedimento estendido xp_fileexist retorna um conjunto de dados. Quando executado, os valores das colunas “Arquivo Existe” e “Diretório Pai Existe” serão 1 se o arquivo e o diretório forem válidos. Se alterarmos a extensão do arquivo, apenas a coluna “Diretório Pai Existe” mostrará 1, indicando que o caminho existe, mas o arquivo não é encontrado nesse caminho.

Também podemos usar o procedimento xp_fileexist para verificar a existência de um diretório específico no sistema de arquivos. A principal diferença em relação ao uso anterior é que passamos apenas o caminho do diretório para o parâmetro nome_do_arquivo. Por exemplo, a seguinte consulta verifica se o arquivo de log de erros existe para a instância do SQL Server:

EXEC Master.dbo.xp_fileexist 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Log\'

A coluna “Arquivo é um Diretório” indica se o diretório pesquisado existe.

Alternativamente, com o SQL Server 2017, uma nova Função de Gerenciamento Dinâmico (DMF) chamada sys.dm_os_file_exists foi introduzida. Essa função tem as mesmas capacidades do procedimento xp_fileexist, mas a sintaxe de uso é ligeiramente diferente:

SELECT * FROM sys.dm_os_file_exists('C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Log\ERRORLOG')

A principal vantagem do DMF sys.dm_os_file_exists é que ele pode ser facilmente combinado com outras tabelas.

Outra alternativa é usar o procedimento estendido xp_cmdshell, que permite executar comandos do sistema operacional a partir do SQL Server. Por padrão, o procedimento xp_cmdshell está desabilitado, portanto, ele precisa ser habilitado usando a opção sp_configure. A seguinte consulta habilita a opção xp_cmdshell:

USE master;
GO
EXEC sp_configure 'show advanced option', '1';
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'xp_cmdshell', 1;
GO
RECONFIGURE;

Para verificar o status da opção xp_cmdshell, a seguinte consulta pode ser executada:

EXEC sp_configure 'xp_cmdshell';

O comando “dir” é um comando do MS-DOS que fornece informações sobre arquivos e diretórios. Embora não seja possível executar diretamente um comando do MS-DOS a partir do SQL Server, podemos usar o procedimento xp_cmdshell para executá-lo. A seguinte consulta demonstra como verificar a existência de um arquivo específico usando o comando “dir”:

DECLARE @CaminhoENomeDoArquivo VARCHAR(100);
DECLARE @TabelaDeArquivos TABLE ([NomeDoArquivo] NVARCHAR(100));
DECLARE @ComandoMsDos AS VARCHAR(300);

SET @CaminhoENomeDoArquivo = '"C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\tempdb.mdf"';
SET @ComandoMsDos = 'dir ' + @CaminhoENomeDoArquivo + ' /b';

INSERT INTO @TabelaDeArquivos
EXEC xp_cmdshell @ComandoMsDos;

IF EXISTS (SELECT 1 FROM @TabelaDeArquivos WHERE [NomeDoArquivo] = 'tempdb.mdf' AND [NomeDoArquivo] IS NOT NULL)
BEGIN
    SELECT 'Arquivo Existe' AS Resultado;
END
ELSE
BEGIN
    SELECT 'Arquivo Não Existe' AS Resultado;
END;

No código acima, usamos variáveis e uma tabela variável para armazenar os valores necessários. A variável @CaminhoENomeDoArquivo armazena o caminho do arquivo e o nome, enquanto a variável @ComandoMsDos armazena o comando do MS-DOS. O sinalizador /B no comando permite que apenas os nomes de arquivo e extensões sejam retornados como resultado. O procedimento xp_cmdshell é executado e o resultado é populado na tabela variável @TabelaDeArquivos. Por fim, verificamos a existência do arquivo na tabela e retornamos o resultado apropriado.

Conclusão

Neste artigo, exploramos diferentes métodos para verificar a existência de um arquivo específico em uma pasta específica usando o SQL Server. O procedimento estendido xp_fileexist, a DMF sys.dm_os_file_exists e o procedimento estendido xp_cmdshell fornecem opções para realizar essa tarefa. É importante considerar as vantagens e limitações de cada método e escolher o mais adequado com base nos requisitos específicos do cenário.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.