2011-03-01 3 views
1

정리 스크립트를 작성하고 있습니다. 이 스크립트는 주말에 실행되고 db를 정리합니다. 테이블은 Eamils와 관련이 있으며 첨부 파일의 경로는 테이블에 저장됩니다. 테이블을 정리할 때도 폴더에서 파일을 삭제해야합니다.커서를 사용하지 않고 T-SQL을 사용하여 폴더에서 여러 파일 삭제

파일 경로는 다음과 같습니다.

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

다음과 같이 여러 개의 파일을 삭제할 수 있습니다.

그러나 FOR XML PATH ('')를 사용하여 테이블에서 CSV를 만들면 끝에 문자열이 잘립니다. 삭제할 행 수가 1000 개가 될 수 있으므로 커서를 사용하여 폴더에서 파일을 삭제하고 싶지는 않습니다.

    내가 커서를 사용하지 않고 폴더 에서 파일을 삭제할 수 있습니다 방법
  1. 어떤 권한이 내가 SQL 서버에서 T-SQL을 사용하여 파일을 삭제 네트워크 폴더에 필요합니까

편집 : 나는 커서를 사용했고, 너무 많은 시간을 들여서는 안된다. 내가 직면하고 하나의 문제는

  • 은 SQL Server가 문을

    xp_cmdshell을 다음과 같이 두 개의 파일로 공간 파일 이름을 고려할 수 있습니다 :

'델 E를 표준 Invite.doc \' 오류가 발생했습니다

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

감사합니다.

+0

왜 당신이 사용하는 SQL을 할 것와 파일 이름을 묶어야합니다 이름 공간 파일을 삭제하려면? 정말로 SQL을 사용해야한다면 왜 커서를 사용하지 않을 것입니까? – sqlvogel

답변

4

개인적으로 커서를 사용하는 것에 대해 개인적으로 걱정하지 않아도됩니다. 커서는 '주로 악의'상태입니다. 작업이 집합 기반 작업이 아니기 때문에 커서가 가장 효과적인 솔루션 일 수 있습니다.

+0

하지만 엄청난 시간이 걸릴 것입니다. – Kashif

3

커서를 사용하는 데 "시간이 많이 걸릴 것"이라고하는 의견이 있지만이 경우 가장 큰 오버 헤드는 커서가 아닌 파일의 실제 삭제입니다.

참고 : 파일 삭제는 RDBMS가 아닌 운영 체제에서 수행합니다. 삭제로


는 xp_cmdshell을 호출하여 수행되고 있으며,이 절차 (하지 기능, 등) 그 때문에, 당신은 그것을 호출하고 테이블의 내용에 전달할 수 없습니다.

당신이 할 수있는 일은 문자열을 만들고 실행하는 것입니다. 그러나이 문자열에는 최대 8000 자로 제한됩니다. 이미 수천 개의 파일을 가지고 있다고 말했기 때문에 8000 자 이내로는 적합하지 않을 것입니다.

이것은 루프가 필요함을 의미합니다.

DECLARE 
    @command VARCHAR(8000), 
    @next_id INT, 
    @next_file VARCHAR(8000), 
    @total_len INT 

SELECT 
    @command = 'DEL ', 
    @total_len = 4 

SELECT TOP 1 
    @next_id = id, 
    @next_file = file_name + ', ' 
FROM 
    table_of_files_to_delete 
ORDER BY 
    id DESC 

WHILE (@next_file IS NOT NULL) 
BEGIN 
    WHILE ((@total_len + LEN(@next_file)) <= 8000) AND (@next_file IS NOT NULL) 
    BEGIN 
    SELECT 
     @command = @command + @next_file, 
     @total_len = @total_len + LEN(@next_file) 

    SELECT 
     @next_file = NULL 

    SELECT TOP 1 
     @next_id = id, 
     @next_file = file_name + ', ' 
    FROM 
     table_of_files_to_delete 
    WHERE 
     id < @next_id 
    ORDER BY 
     id DESC 
    END 

    SET @command = SUBSTRING(@command, 1, @total_len - 2) -- remove the last ', ' 

    EXEC xp_cmdshell @command 

    SELECT 
    @command = 'DEL ', 
    @total_len = 4 
END 


하지 꽤, 응?

삭제해야하는 항목에 따라 할 수있는 일은 와일드 카드 사용입니다. 예를 들어 :

EXEC xp_cmdshell 'DELETE C:\abc\def\*.txt' 
1

"

xp_cmdshell 'del "E:\Standard Invite.doc"' 
관련 문제