Pokud potřebujeme vypsat v T-SQL seznam adresářů, případně souborů na disku, máme tyto základní možnosti: extended proceduru xp_dirtree, DOS příkazy pomocí xp_cmdshell, CLR nebo OLE (OAAutomation objekty). Dnes se povídáme na možnosti, které nám poskytuje xp_dirtree a xp_cmdshell.
Především je nutné zmínit, že xp_dirtree je nedokumentovaná a nepodporovaná procedura a její použití může přinést později problémy v případě upgrade SQL Serveru na vyšší verzi.
xp_dirtree má tyto vstupní parametry:
- Cesta na úložišti, kde chceme zahájit procházení případně vypsat obsah.
- Hloubka, do které se mají složky procházet. Ve výchozím nastavení 0 – bez omezení.
- Nastavení, zda zobrazovat pouze složky nebo i soubory. Ve výchozím nastavení 0 – nezobrazovat soubory.
Nyní praktický příklad: necháme si vypsat kompletní obsah adresáře “c:\Program Files\Microsoft SQL Server\120\SDK”. Chceme vidět všechny podložky do omezené hloubky a také nás zajímají soubory ve složkách. Výstup procedury uložíme do proměnné @DirList pro případné pozdější použití.
DECLARE @DirList TABLE ( DirName VARCHAR(128), Depth INT, IsFile BIT ) INSERT @DirList EXEC master..xp_dirtree 'c:\Program Files\Microsoft SQL Server0\SDK',0, 1 SELECT * FROM @DirList GO
xp_cmdshell
Druhou možnost nám přináší xp_cmdshell, která je na rozdíl od xp_dirtree plně dokumentovaná a podporovaná. Pomocí této procedury můžeme spouštět libovolný kód pro příkazovou řádku, což ovšem není jen výhoda, ale také značné bezpečností riziko. Právě z toho důvodu je procedura ve výchozím stavu zakázána a je potřeba ji povolit pomocí konfigurační procedury sp_configure:
EXEC [sys].[sp_configure] 'show advanced options', 1 GO RECONFIGURE GO EXEC [sys].[sp_configure] 'xp_cmdshell', 1 GO RECONFIGURE GO
Volání procedury je jednoduché a pro zobrazení obsahu adresáře použijeme běžné dosové příkazy:
EXEC master..xp_cmdshell 'DIR /b c:\Program Files\Microsoft SQL Server0\' GO
Výstup z volání xp_cmdshell můžeme pochopitelně uložit pro pozdější zpracování obdobným způsobem jako v předchozím příkladu.