TSQL - Обновление столбца на основе столбца бит

У меня есть столбец идентификаторов в моей таблице [ID] . У меня также есть вычисляемый столбец, основанный на столбце идентификации, подобном этому;

create table [dbo].[tblMaster] (
ID bigint identity(1,1),
GlobalFamilyUniqueID int,
DupeIdentifier as cast('EDME' + RIGHT(�'+ISNULL(cast([ID] as nvarchar(max)),''),8) as nvarchar(30)),
ControlNumber nvarchar(30),
NuixGuid nvarchar(50),
TopLvlGuid nvarchar(50),
ParentGuid nvarchar(50),
CustodianArtifactID int,
IsGlobalFamilyUnique int,
IsCustodianFamilyUnique int,
IsItemUnique int,
ItemUniqueDupID nvarchar(100),
IsChild int,
GroupIdentifier nvarchar(100),
DatasourceID int,
MD5Hash nvarchar(32),
GlobalFamilyDupID nvarchar(100),
CustodianFamilyDupId nvarchar(100),
ExportSessionID nvarchar(100)

)

Я хочу обновить столбец ControlNumber на IsGlobalFamilyUnique столбца IsGlobalFamilyUnique . В минуту DupeIdentifier будет иметь значение независимо от того, IsGlobalFamilUnique = 1 или 0 . Мне нужно, чтобы ControlNumber имел инкрементное значение, основанное на последнем значении в поле ControlNumber (я создал другой столбец GlobalFamilyUnqiueID как GlobalFamilyUnqiueID «counter»), но только когда IsGlobalFamilUnique равен 1 .

Вот где я сейчас;

update x
    set 
    GlobalFamilyUniqueID = [ProposedGlobalFamilyUniqueID],
    ControlNumber = [ProposedControlNumber]
from(
    Select top 10 [id],
        DupeIdentifier,
    --  ControlNumber,
        isglobalfamilyunique,
        --GlobalFamilyUniqueID,
        GlobalFamilyUniqueID,
        Row_Number() Over(Order By [id]) [ProposedGlobalFamilyUniqueID],
        ControlNumber,
        'TEST' + RIGHT(�'+ISNULL(cast(Row_Number() Over(Order By [id]) as nvarchar(30)),''),8) [ProposedControlNumber]
    From dbo.tblMaster mstr1
    where IsGlobalFamilyUnique = 1 and ControlNumber is null
)x

Проблема в том, что при повторном запуске кода ProposedGlobalFamilyUniqueID снова начнется с 1 . Он должен начинаться с последнего значения ProposedGlobalFamilyUniqueID в dbo.tblMaster . Я предполагаю, что это потому, что я ограничиваю запрос тем, где ControlNumber is null , но я не знаю, как обойти это.

Это пример успешного запуска кода при первом запуске: введите описание изображения здесь

Конечным результатом должно быть последовательное значение ControlNumber где IsGlobalFamilyUnique = 1

Примеры данных

 declare @test table (
    ID bigint identity(1,1),
    GlobalFamilyUniqueID int,
    DupeIdentifier as cast('EDME' + RIGHT(�'+ISNULL(cast([ID] as nvarchar(max)),''),8) as nvarchar(30)),
    ControlNumber nvarchar(30),
    MD5Hash nvarchar(32),
    IsGlobalFamilyUnique bit
)

insert into @test (MD5Hash, IsGlobalFamilyUnique)values
--1
('ABC', 1),
--2
('DEF', 1),
--3
('GHI', 1),
--4
('JKL', 1),
--5
('ABC', 0),
--6
('XXX', 1)

Результат должен быть; введите описание изображения здесь

Всего 1 ответ


Храните поле ControlNumber в виде числа, старайтесь не делать его varchar, потому что он не сможет вычислить.

Прежде всего, удалите все существующие значения контрольных номеров перед попыткой сценария.

Затем попробуйте следующее:

 DECLARE @max as bigint

 SELECT @max = Max(id)

 FROM tblMaster 


  Select [id],
        DupeIdentifier,
    --  ControlNumber,
        isglobalfamilyunique,
        --GlobalFamilyUniqueID,
        GlobalFamilyUniqueID,
        @max + Row_Number() Over(Order By [id]) [ProposedGlobalFamilyUniqueID],
        ControlNumber      
    From dbo.tblMaster mstr1
    where IsGlobalFamilyUnique = 1 and ControlNumber is null


   update x
    set 
    GlobalFamilyUniqueID = [ProposedGlobalFamilyUniqueID],
    ControlNumber =   x.Proposed_Control_Number

from(
    Select [id],
        DupeIdentifier,
    --  ControlNumber,
        isglobalfamilyunique,
        --GlobalFamilyUniqueID,
        GlobalFamilyUniqueID,
        Row_Number() Over(Order By [id]) [ProposedGlobalFamilyUniqueID],
        ControlNumber,
          @max + Row_Number() Over(Order By [id]) as Proposed_Control_Number   
    From dbo.tblMaster mstr1
    Where IsGlobalFamilyUnique = 1 and ControlNumber is null
)x

Есть идеи?

10000