Удалить несколько файлов из папки с помощью T-SQL без использования курсора - PullRequest
1 голос
/ 01 марта 2011

Я пишу сценарий очистки. Этот скрипт будет работать в выходные дни и очистить базу данных. Таблицы относятся к Eamils, а пути вложений хранятся в таблице. При очистке таблиц я также должен удалить файлы из папки.

Путь к файлам подобен следующему.

\\xxx.xxx.xxx.xxx\EmailAttachments\Some Confirmation for xyz Children Centre_9FW4ZE1C57324B70EC79WZ15FT9FA19E.pdf

Я могу удалить несколько файлов следующим образом.

xp_cmdshell 'del c:\xyz.txt, abc.txt'

НО, когда я создаю CSV из таблицы, используя FOR XML PATH (''), строка обрезается в конце. Возможно, нужно удалить 1000 строк, поэтому я не хочу использовать курсор для удаления файлов из папки.

  1. Как я могу удалить файлы из папки без использования курсора
  2. Какие разрешения мне нужны на сетевая папка для удаления файлов с помощью t-sql с сервера sql

EDIT: Я использовал курсор, и он выглядит хорошо, не занимая так много времени. Одна проблема, с которой я сталкиваюсь, это

  • Сервер sql рассматривает имя файла с пробелом как два файла, как в следующем выражении

    xp_cmdshell 'del E: \ Standard Invite.doc'

выдает ошибку

Could Not Find E:\Standard
Could Not Find C:\Windows\system32\Invite.doc
NULL

Спасибо.

Ответы [ 4 ]

4 голосов
/ 01 марта 2011

Лично я бы не стал слишком беспокоиться об использовании курсора здесь. Курсоры только «в основном злые»; поскольку ваша задача не является операцией на основе множеств, курсор может быть наиболее эффективным решением.

3 голосов
/ 01 марта 2011

Несмотря на то, что у вас есть комментарий о том, что для использования курсора потребуется «очень много времени», в этом случае самыми большими накладными расходами является фактическое удаление файла (а не курсора).

Примечание. Удаление файла выполняется операционной системой, а не СУБД.


Поскольку удаление выполняется с помощью вызова xp_cmdshell, и потому что это процедура (нефункция и т. д.), вы не можете вызвать ее и передать содержимое таблицы.

Что вы можете сделать, это создать строку и выполнить ее.Но обратите внимание, в этой строке вы можете использовать не более 8000 символов.Как вы уже сказали, что у вас могут быть тысячи файлов, вы, несомненно, не поместите его в пределах 8000 символов.

Это означает, что вам понадобится цикл, несмотря ни на что.1014 *

Не красиво, а?

Что вы можете сделать, в зависимости от того, что нужно удалить, это использовать подстановочные знаки.Например:

EXEC xp_cmdshell 'DELETE C:\abc\def\*.txt'
1 голос
/ 01 марта 2011

Чтобы удалить файлы с пробелом в имени, необходимо заключить имя файла в "

xp_cmdshell 'del "E:\Standard Invite.doc"'
0 голосов
/ 13 мая 2019
DECLARE @deleteSql varchar(500)
   ,@myPath  varchar(500) = '\\DestinationFolder\'

SET @deleteSql = 'EXEC master..xp_cmdshell ''del '+@myPath +'*.csv'''
EXEC(@deleteSql)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...