【发布时间】:2019-12-27 06:47:53
【问题描述】:
我正在尝试创建一个脚本,它将遍历许多文件及其位置,确保文件存在,如果不存在,则从它所在的位置复制它。
所有文件至少存在一个位置。例如文档 ID 8675309 可能存在于存储库 5 中,但它也需要存在于存储库 12 中,而文档 9035768 存在于存储库 12 中但也需要存在于 5 中。到目前为止,我一直在写一个临时表,我得到了所有文件的 ID、位置以及它们是否存在。现在我需要通过将文件复制到正确的位置来修复数据。由于其中有超过 250,000 个,因此手动复制不是很可行。我也不允许下载任何 3rd 方工具来完成此任务。以下是我目前拉出正确数据的内容,也是我第一次使用游标,如果有什么建议,请告诉我!
BEGIN TRANSACTION
DECLARE @document_id INT
DECLARE @repository_id INT
DECLARE @root_access varchar(50)
DECLARE @location varchar(50)
DECLARE @expected_location varchar(100)
DECLARE @VerificationCursor cursor
SET
@VerificationCursor = CURSOR FAST_FORWARD FOR
(SELECT object_id, repository_id, location
FROM m3_object_repository where creatortime >= '2018-01-01' AND creatortime <= '2018-12-31')
OPEN @VerificationCursor
FETCH NEXT FROM @VerificationCursor INTO @document_id, @repository_id, @location
print 'CREATING TEMPORARY TABLE'
CREATE TABLE #Verification_Files
(
document_id INT,
repository_id INT,
file_exists VARCHAR(50),
expected_location VARCHAR(100)
)
print 'BEGINNING TASKS'
print 'TESTING IF DOCUMENTS EXIST, THIS MAY TAKE A WHILE:'
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO #Verification_Files (document_id, repository_id, file_exists, expected_location)
VALUES (@document_id, @repository_id, (SELECT dbo.fc_FileExists(
(
SELECT dev.root_access FROM m3_repositories rep
LEFT JOIN m3_device dev ON rep.m2_id = dev.m2_id AND rep.name = dev.name
WHERE rep.repository_id = @repository_id AND rep.m2_id = 2
)
+ 'EbImages\' + @location +cast(@document_id as varchar))),
(
SELECT dev.root_access FROM m3_repositories rep
LEFT JOIN m3_device dev ON rep.m2_id = dev.m2_id AND rep.name = dev.name
WHERE rep.repository_id = @repository_id AND rep.m2_id = 2
)
+ 'EbImages\' + @location +cast(@document_id as varchar)
);
FETCH NEXT FROM @VerificationCursor INTO @document_id, @repository_id, @location
END
print 'TABLE RECORDS ADDED'
print 'CONVERTING BIT VALUES TO TRUE/FALSE'
UPDATE #Verification_Files
SET file_exists = 'FALSE' WHERE file_exists = '0'
UPDATE #Verification_Files
SET file_exists = 'TRUE' WHERE file_exists = '1'
CLOSE @VerificationCursor
DEALLOCATE @VerificationCursor
【问题讨论】:
标签: sql-server file tsql database-cursor