quinta-feira, 14 de março de 2013

SQL Server - entendendo o master.dbo.xp_dirtree para listar conteúdo de um diretório

No SQL Server, para listar os arquivos e pastas de um diretório, utilizamos o comando master.dbo.xp_dirtree

Esta procedure possui 3 parâmetros:

  1. Directory - este parâmetro indica o diretório cujo conteúdo você deseja listar
  2. Depth - este parâmetro indica quantos níveis de subpasta você deseja listar. 0 irá listar todas as subpastas.
    • 0 - lista todas as subpastas
    • 1 - lista somente a pasta indicada no parâmetro directory
    • 2- lista a pasta indicada no parâmetro directory + uma subpasta
    • ... e assim por diante
  3. File - indica o que você deseja listas no seu diretório:
    • 0 - somente pastas
    • 1 - pastas e arquivos
Esta procedure retorna 3 colunas
  • Name - nome do arquivo ou pasta
  • Depth - indica o nível em que o arquivo/pasta está (1 - está na pasta, 2 - está na subpasta, etc)
  • IsFile - 0 indica que é uma pasta e 1 indica que é um arquivo.

==================================================
Exemplo:
===================================================

Tenho a seguinte estrutura:
  • C:\Pasta1
    • Arquivo1.txt
    • Arquivo11.txt
    • Pasta2
      • Arquivo2.txt
      • Arquivo22.txt
      • Pasta3
        • Arquivo3.txt
        • Arquivo33.txt

O comando abaio irá listar todos os arquivos e pastas, mas somente no primeiro nível, ou seja, somente o conteúdo do diretório C:\Pasta. Não irá listar o conteúdo das sub-pastas.
--------------------------
CREATE TABLE #FileList(Name varchar(200), depth numeric, IsFile numeric) 
INSERT INTO #FileList exec master.dbo.xp_dirtree 'C:\Pasta1', 1, 1 

select * from #filelist
drop table #filelist
---------------------------

O comando abaixo irá listar o conteúdo da Pasta1 e o conteúdo da pasta2 (segundo nível)
exec master.dbo.xp_dirtree 'C:\Pasta1', 2, 1 


O comando abaixo irá listar o conteúdo da Pasta1 , pasta2 (segundo nível) e pasta 3 (terceiro nível)
exec master.dbo.xp_dirtree 'C:\Pasta1', 3, 1 


Caso você execute desta forma, a procedure irá retornar apenas as coluna Name e Depth, pois, uma vez que você não está listando arquivos, você não precisa da coluna IsFile.

exe master.dbo.xp_dirtree 'C:\Pasta1', 1, 0   
ou
exe master.dbo.xp_dirtree 'C:\Pasta1', 1