Как из SQL запроса прочитать список файлов в выбранной папке и отсортировать по дате создания?

Ранее пользовался недокументированной утилитой xp_dirtree, но недавно столкнулся со сложностями её использования. Сначала она не хотела работать без всякого объяснения причин с расшаренной подпапкой вида \\ИМЯСЕРВЕРА\ИМЯРАСШАРЕННОЙПАПКИ\ИМЯПОДПАПКИ\ИМЯЕЩЁОДНОЙПОДПАПКИ. Как оказалось позже проблема оказалась в том, что пользователю, от имени которого работает сервис SQL сервера, были предоставлены права на конечную подпапку, но не были предоставлены права на вышележащую. С правами разобрались, хранимая процедура заработала, но спустя некоторое время возникла задача получения не просто списка файлов, а ещё и дат их создания, а эту информацию xp_dirtree не предоставляет. Пришлось воспользоваться процедурой xp_cmdshell и досовской командой dir. Вполне возможно, что вам это тоже пригодится:

Как из SQL запроса прочитать список файлов в выбранной папке и отсортировать по дате создания?

/*
Чтение списка файлов и папок в выбранном каталоге файловой системы с датой создания
Автор: Васильев А.А.
Дата создания/Последнего изменения: 21.03.2024/21.03.2024
exec usr_DirectoryListing 'f:\txt\TEMP', '0'
exec usr_DirectoryListing 'f:\txt\TEMP\*.xml', '0'
*/
CREATE procedure usr_DirectoryListing
@Directory nvarchar(100)='f:\txt',
@ShowFilesOnly char(1)='1'--0=показать и файлы, и папки, 1=Только файлы
as
declare @DirCommand nvarchar(120)
set @DirCommand='dir '+@Directory
create table #dir (DirString nvarchar(500))
insert into #dir
exec xp_cmdshell @DirCommand
select
convert(datetime,case left(DirString,2)
when '01' then 'Jan'
when '02' then 'Feb'
when '03' then 'Mar'
when '04' then 'Apr'
when '05' then 'May'
when '06' then 'Jun'
when '07' then 'Jul'
when '08' then 'Aug'
when '09' then 'Sep'
when '10' then 'Oct'
when '11' then 'Nov'
else 'Dec'
end+space(1)+substring(DirString,4,2)+space(1)+substring(DirString,7,4)+space(1)+replace(substring(DirString,13,8),' ',''),0) as Created,
case when substring(DirString,25,5)='<DIR>' then 'SubDir' else 'File' end as ObjType,
substring(DirString,40,461) as NameOfFileOrSubDir,
DirString
from #dir where isnumeric(left(DirString,1))=1 and @ShowFilesOnly<=case when substring(DirString,25,5)='<DIR>' then 0 else 1 end 
order by Created desc
drop table #dir

Не обращайте внимание на эту уродливую конструкцию:

convert(datetime,case left(DirString,2)
when '01' then 'Jan'
when '02' then 'Feb'
when '03' then 'Mar'
when '04' then 'Apr'
when '05' then 'May'
when '06' then 'Jun'
when '07' then 'Jul'
when '08' then 'Aug'
when '09' then 'Sep'
when '10' then 'Oct'
when '11' then 'Nov'
else 'Dec'
end+space(1)+substring(DirString,4,2)+space(1)+substring(DirString,7,4)+space(1)+replace(substring(DirString,13,8),' ',''),0) as Created

Это пришлось сделать на скорую руку из-за настроек даты на сервере, у вас, возможно, дата будет в нормальном формате и все эти ужимки не понадобятся.