假設你有類似這樣的一個表:
create table Persons
(
ID int identity primary key,
Name varchar(100),
Street varchar(100),
HouseNumber int,
PostCode varchar(100),
UniqueCode uniqueidentifier
)
您需要創建認定已經進入具有相同的複合鍵的人觸發:
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
並假設這將是數據:
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')
然後
select *
from Persons
將提供:
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
)
他們是分開的,因爲SQL Server執行標量表達式之前加入:如果執行以下兩個更新
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
您現有的數據將被更新。我的第一個承擔這一點是更新查詢與所有列的派生表分組並添加newid()列,但作爲內部連接到人表執行第一個ids是唯一的每一行再次。
在執行此操作之前禁用觸發器,稍後重新啓用它。 uniqueCode不應該在程序中設置,只能在觸發器中設置。您需要(名稱,街道,HouseNumber,PostCode)和UniqueCode上的另一個組合索引。
除此之外,我已經看到你關於這個項目的其他問題。你想做什麼?我不確定小學和高中桌子之間的關係的性質。如果你想通過某個人連接他們,那麼你應該有一個帶有身份主鍵的人表。兩張表都會引用這一個,並且在識別某人的學術路徑時你沒有問題:-)
這是什麼版本的Sql Server? – 2012-04-03 09:32:28