是否要从版本控制的EDM系统重命名表中的重复文件?

问题描述 投票:0回答:1

我正在尝试重命名具有300,000行的EDM系统的表中的重复文件。我遇到的问题是,数百个文件夹中有成千上万个重复的文件名,每个文件夹都有一个文件的多个版本。我需要创建唯一的文件名以导入到新系统中,因此我要根据文件名和文件夹位置在文件扩展名-1,-2,-3等之前附加。

我想在第一个文件夹中将文件名的初始实例及其所有版本附加为“ -1”,在另一个文件夹中将文件名的第二实例及其所有版本附加为“ -2”。我有文件ID,可以将其用作发布附加文件的排序顺序,但顺序确实无关紧要。我提供了当前表结果的示例,以及嵌套在其中的所需结果。

到目前为止,我想出的是:

With DuplicateFileName As
        (
        Select FolderID, FileName
            , Row_Number() Over ( Partition By Filename Order By FolderID ) As Rnk
        From NewFilename
        )
    Update NewFilename
    Set FileModifier = Case
                        When Rnk > 1 Then '-' + Cast(Rnk As varchar(10))
                        Else ''
                        End
    From NewFilename As T
        Join DuplicateFileName As D
            On D.FolderID = T.FolderID

下面是一个文件名的示例。它已经接近了,但是无论尝试什么,我都无法像我需要的那样完全添加它。我已经接近了,但似乎无法完美实现。

 FolderID      FileID   FileName      Version   Current    Desired   
    3506        16875   Gadget.XLSX    1                    -1
    3506        16876   Gadget.XLSX    2                    -1
    3506        16877   Gadget.DOCX    1                    -1        
    3506        16878   Gadget.DOCX    2                    -1        
    3522        17578   Gadget.XLSX    1          -3        -2
    3522        17579   Gadget.DOCX    1          -3        -2
    3525        17602   Gadget.XLSX    1          -4        -3
    3525        17603   Gadget.DOCX    1          -4        -3
sql-server tsql ssms
1个回答
0
投票

您需要使用DENSE_RANK()而不是ROW_NUMBER(),因为同一文件夹中的相同文件名可以具有相同的文件修饰符。而且,这种情况下不需要表达。考虑以下内容

:


CREATE TABLE #NewFilename  (FolderID int, FileID int,   FileName varchar(40), Version int, FileModifier varchar(4) ) 
 INSERT INTO #NewFilename VALUES(3506,16875,'Gadget.XLSX',1,'')
INSERT INTO #NewFilename VALUES(3506,16876,'Gadget.XLSX',2,'')
INSERT INTO #NewFilename VALUES(3506,16877,'Gadget.DOCX',1,'')        
INSERT INTO #NewFilename VALUES(3506,16878,'Gadget.DOCX',2,'')        
INSERT INTO #NewFilename VALUES(3522,17578,'Gadget.XLSX',1,'')
INSERT INTO #NewFilename VALUES(3522,17579,'Gadget.DOCX',1,'')
 INSERT INTO #NewFilename VALUES(3525,17602,'Gadget.XLSX',1,'')
 INSERT INTO #NewFilename VALUES(3525,17603,'Gadget.DOCX',1,'') 

  With DuplicateFileName As
        (
        Select FolderID, FileName
            , DENSE_RANK() Over ( Partition By Filename Order By FolderID ) As Rnk
        From #NewFilename
        )
    Update #NewFilename
    Set FileModifier =  '-' + Cast(Rnk As varchar(10))
    From #NewFilename As T
        Join DuplicateFileName As D
            On D.FolderID = T.FolderID



select * from #NewFilename
order by FolderID
© www.soinside.com 2019 - 2024. All rights reserved.