【问题标题】:How to copy files from one location to another depending on where the file does not exist如何根据文件不存在的位置将文件从一个位置复制到另一个位置
【发布时间】: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


    【解决方案1】:

    那么,您现在是否获得了文件在哪里以及它们需要在哪里的列表?做一个

    SELECT CONCAT('copy "', file_location, '" "', file_copy_to, '"') from temp_table
    

    这将在 SSMS 网格中生成 250,000 个 DOS 复制命令,将结果保存到名为“go.bat”的文件并双击它

    如果您不知道文件是否存在,您可以将一些 IF EXIST 放入您的 concat 等 - How to verify if a file exists in a batch file?

    有时只编写一个生成其他类型“代码”的 sql 然后获取结果并运行它会更容易,尤其是在一次性操作时

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-02
      • 2015-01-30
      • 1970-01-01
      • 1970-01-01
      • 2019-03-21
      • 2011-05-03
      相关资源
      最近更新 更多