Angenommen, Sie haben eine Tabelle, ähnlich wie diese:
create table Persons
(
ID int identity primary key,
Name varchar(100),
Street varchar(100),
HouseNumber int,
PostCode varchar(100),
UniqueCode uniqueidentifier
)
Sie einen Trigger erstellen würde, die bereits findet eingegebenen Personen den gleichen Verbundschlüssel aufweist:
create trigger AssignPersonGroup on Persons
after insert, update
as
set nocount on
update Persons
set UniqueCode =
isnull(
(select top 1 UniqueCode from Persons
where UniqueCode is not null
and Inserted.Name = Persons.Name
and Inserted.Street = Persons.Street
and Inserted.HouseNumber = Persons.HouseNumber
and Inserted.PostCode = Persons.PostCode)
, newid())
from Inserted inner join Persons
on Inserted.ID = Persons.ID
Und davon aus, das das wäre Daten:
insert into persons (Name, Street, HouseNumber, PostCode)
values ('Zagor', 'Darkwood', 23, '01010')
insert into persons (Name, Street, HouseNumber, PostCode)
values ('Zagor', 'Darkwood', 23, '01010')
insert into persons (Name, Street, HouseNumber, PostCode)
values ('Chico', 'Darkwood', 23, '01010')
Dann
select *
from Persons
Würde liefern:
ID Name Street HouseNumber PostCode UniqueCode
1 Zagor Darkwood 23 01010 A113D12D-F730-42DD-B3EE-AC33E34C0679
2 Zagor Darkwood 23 01010 A113D12D-F730-42DD-B3EE-AC33E34C0679
3 Chico Darkwood 23 01010 FD0739AF-525C-42C2-B929-0AB8EEAC3A73
Ihre bestehenden Daten aktualisiert werden würde, wenn Sie folgenden zwei Updates ausführen:
update persons
set uniquecode = newid()
update Persons
set uniqueCode=
(
select top 1 uniqueCode
from Persons groups
where UniqueCode is not null
and groups.Name = Persons.Name
and groups.Street = Persons.Street
and groups.HouseNumber = Persons.HouseNumber
and groups.PostCode = Persons.PostCode
order by ID
)
sie getrennt werden, da SQL Server verbindet ausgeführt, bevor skalare Ausdrücke. Mein erstes Ergebnis war eine Aktualisierungsabfrage mit einer abgeleiteten Tabellengruppierung für alle Spalten und Hinzufügen einer newid() - Spalte, aber als innerer Join der Personentabelle ausgeführt wurde, wurden die ersten ids für jede Zeile erneut eindeutig.
Deaktivieren Sie den Trigger, bevor Sie dies tun, und aktivieren Sie ihn später erneut. uniqueCode sollte nicht im Programm gesetzt werden, nur im Trigger. Sie benötigen einen zusammengesetzten Index für (Name, Straße, Hausnummer, Postcode) und einen weiteren für UniqueCode.
Abgesehen davon habe ich Ihre andere Frage zu diesem Projekt gesehen. Was versuchst du zu machen? Ich bin mir nicht sicher über die Art der Beziehung zwischen Primar- und Highschool-Tischen. Wenn Sie sie mit einer bestimmten Person verbinden möchten, sollten Sie eine Personentabelle mit einem Identitätsprimärschlüssel haben. Beide Tabellen würden auf dieses verweisen, und Sie würden keine Probleme haben, jemandes akademischen Weg zu identifizieren :-)
Welche Version von Sql Server ist das? –