Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Получение списка файлов в папке (в т.ч. подпапках)  [new]
Lanselot
Member

Откуда:
Сообщений: 76
Добрый день!
Прошу помочь с проблемой.
Есть путь к папке -> нужно получить таблицу всех абсолютных путей к файлам определенного типа.
Сделать нужно в хранимой процедуре или функции. Т.к. в дальнейшем будет использоваться не только мной.
Мои потуги:
1) Функция:
IF OBJECT_ID (N'dbo.FilesInFolder', N'FT') IS NOT NULL
    DROP FUNCTION dbo.FilesInFolder;
GO

CREATE FUNCTION dbo.FilesInFolder(@path_dir varchar(255))

RETURNS 
@t TABLE (id int identity(1,1),put varchar(max))

AS
BEGIN
	declare @p sysname='DIR '+@path_dir+' /S /B /A-D' --dos-команда для определения имен файлов в каталоге
	insert into @t exec xp_cmdshell @p
    delete from @t where put is null
	SELECT id, put FROM @t

	RETURN 
END

ругается "Недопустимое использование оператора "INSERT EXEC", оказывающего побочное действие, в функции."
2) Процедура:
IF OBJECT_ID (N'dbo.FilesInFolder', N'P') IS NOT NULL
    DROP PROCEDURE dbo.FilesInFolder;
GO

CREATE PROCEDURE dbo.FilesInFolder @path_dir varchar(255)
AS
	declare @p sysname='DIR '+@path_dir+' /S /B /A-D' --dos-команда для определения имен файлов в каталоге
	declare @t table (id int identity(1,1),put varchar(max)) -- таблица имен файлов
BEGIN
	insert into @t exec xp_cmdshell @p
    delete from @t where put is null
	SELECT id, put FROM @t
END
GO


не ругается, НО вызов:
declare @y table (id int identity(1,1),put varchar(max)) -- таблица имен файлов

insert into @y exec dbo.FilesInFolder @path

приводит к ошибке: "Инструкция INSERT EXEC не может быть вложенной."
Прочел что так, делать нельзя.
Вопрос: как получить функцию, возвращающую список файлов в папке.
13 янв 14, 11:21    [15406738]     Ответить | Цитировать Сообщить модератору
 Re: Получение списка файлов в папке (в т.ч. подпапках)  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Lanselot,

автор
Вопрос: как получить функцию, возвращающую список файлов в папке.


использовать процедуру?
13 янв 14, 11:23    [15406755]     Ответить | Цитировать Сообщить модератору
 Re: Получение списка файлов в папке (в т.ч. подпапках)  [new]
Lanselot
Member

Откуда:
Сообщений: 76
Как получить функцию или процедуру, возвращающую список файлов в папке.
13 янв 14, 11:28    [15406785]     Ответить | Цитировать Сообщить модератору
 Re: Получение списка файлов в папке (в т.ч. подпапках)  [new]
Lanselot
Member

Откуда:
Сообщений: 76
Ну или вызвать эту процедуру без ошибки
13 янв 14, 11:31    [15406799]     Ответить | Цитировать Сообщить модератору
 Re: Получение списка файлов в папке (в т.ч. подпапках)  [new]
Glory
Member

Откуда:
Сообщений: 104751
Lanselot
Ну или вызвать эту процедуру без ошибки

Не делать вложенных INSERT EXEC
13 янв 14, 11:33    [15406814]     Ответить | Цитировать Сообщить модератору
 Re: Получение списка файлов в папке (в т.ч. подпапках)  [new]
user89
Member

Откуда:
Сообщений: 2083
Lanselot,

CREATE PROCEDURE dbo.FilesInFolder @path_dir varchar(255)
AS
	declare @p sysname='DIR '+@path_dir+' /S /B /A-D' --dos-команда для определения имен файлов в каталоге
	--declare @t table (id int identity(1,1),put varchar(max)) -- таблица имен файлов
BEGIN
	--insert into @t exec xp_cmdshell @p
    --delete from @t where put is null
	--SELECT id, put FROM @t
  exec xp_cmdshell @p
END
GO

declare @t table (put varchar(max))
insert @t exec dbo.FilesInFolder 'c:\Util';
select * from @t where put is not null

З.Ы. А бывают ситуации, когда путь = null ?
13 янв 14, 11:34    [15406818]     Ответить | Цитировать Сообщить модератору
 Re: Получение списка файлов в папке (в т.ч. подпапках)  [new]
Lanselot
Member

Откуда:
Сообщений: 76
Да. "dir" выдает корень как NULL
13 янв 14, 11:36    [15406829]     Ответить | Цитировать Сообщить модератору
 Re: Получение списка файлов в папке (в т.ч. подпапках)  [new]
Lanselot
Member

Откуда:
Сообщений: 76
Спасибо, помогло. Тему можно считать закрытой.
13 янв 14, 11:42    [15406870]     Ответить | Цитировать Сообщить модератору
 Re: Получение списка файлов в папке (в т.ч. подпапках)  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Есть, xp_dirtree, хоть и недокументированная. http://www.sqlservercentral.com/blogs/everyday-sql/2012/12/31/how-to-use-xp_dirtree-to-list-all-files-in-a-folder-part-2/
13 янв 14, 11:47    [15406907]     Ответить | Цитировать Сообщить модератору
 Re: Получение списка файлов в папке (в т.ч. подпапках)  [new]
Lanselot
Member

Откуда:
Сообщений: 76
С xp_cmdshell 'DIR...' быстрее получается. Потому как можно вывести ВСЕ файлы каталога и ВСЕХ подкаталогов определенного расширения (например в качестве @path_dir задать 'D:\ediECOD\4602277999993EC\*.xml')
13 янв 14, 12:11    [15407047]     Ответить | Цитировать Сообщить модератору
 Re: Получение списка файлов в папке (в т.ч. подпапках)  [new]
user89
Member

Откуда:
Сообщений: 2083
Lanselot,

хорошая статья Обходим ошибку An INSERT EXEC statement cannot be nested
Я там даже комментарий оставил
13 янв 14, 12:22    [15407147]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить