У меня есть столбец идентификаторов в моей таблице [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