TR_ADDRESS_UPDATE_SEARCHCONSTITUENT
Definition
Copy
CREATE trigger TR_ADDRESS_UPDATE_SEARCHCONSTITUENT on dbo.ADDRESS after update not for replication
as begin
if isnull(context_info(),0x)<>0xE2DF375A033A104382689B8EAC5165AD
begin
if update(CONSTITUENTID)
begin
-- Remove rows for old constituents.
delete from dbo.SEARCHCONSTITUENT
where ADDRESSID in(select d.ID
from deleted d, inserted i
where d.ID = i.ID
and d.CONSTITUENTID <> i.CONSTITUENTID)
if @@rowcount > 0
begin
-- If there are no more addresses for the old constituent, add a name-only row.
declare @DELETEDCONSTITS table (CONSTITUENTID uniqueidentifier)
-- Load the distinct deleted constituents into a temp table.
-- Originally I had this in-line with the insert below but it caused performance issues.
-- Taking it out to a temp table resolved this.
insert into @DELETEDCONSTITS
select distinct d.CONSTITUENTID
from deleted d, inserted i
where d.ID = i.ID
and d.CONSTITUENTID <> i.CONSTITUENTID;
insert into dbo.SEARCHCONSTITUENT (ID,CONSTITUENTID,
KEYNAME,FIRSTNAME,MIDDLENAME,NAMETYPECODE,
TITLECODEID,SUFFIXCODEID,
ISORGANIZATION,ISGROUP)
select newid(),
d.CONSTITUENTID,
c.KEYNAME,
c.FIRSTNAME,
c.MIDDLENAME,
c.NAMETYPECODE,
c.TITLECODEID,
c.SUFFIXCODEID,
c.ISORGANIZATION,
c.ISGROUP
from @DELETEDCONSTITS d
inner join dbo.V_CONSTITUENTALLNAMES c on c.ID = d.CONSTITUENTID
where c.KEYNAME<>''
and not exists(select 'x'
from dbo.SEARCHCONSTITUENT
where CONSTITUENTID = d.CONSTITUENTID);
-- Delete name-only rows for constituents for which we are adding addresses.
delete from dbo.SEARCHCONSTITUENT
where CONSTITUENTID in(select i.CONSTITUENTID
from deleted d, inserted i
where d.ID = i.ID
and d.CONSTITUENTID <> i.CONSTITUENTID)
and ADDRESSID is null;
-- Add rows for new constituents.
insert into dbo.SEARCHCONSTITUENT (ID,CONSTITUENTID,ADDRESSID,
KEYNAME,FIRSTNAME,MIDDLENAME,NAMETYPECODE,
TITLECODEID,SUFFIXCODEID,
COUNTRYID,POSTCODE,STREETNUMBER,STREETNAME,
ISORGANIZATION,ISGROUP,ALIASID)
select newid(),
c.ID,
inserted.ID,
c.KEYNAME,
c.FIRSTNAME,
c.MIDDLENAME,
c.NAMETYPECODE,
c.TITLECODEID,
c.SUFFIXCODEID,
inserted.COUNTRYID,
case when ltrim(rtrim(inserted.POSTCODE)) like '[0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]' then left(ltrim(inserted.POSTCODE),5) else ltrim(rtrim(inserted.POSTCODE)) end,
isnull(PARSEDADDRESS.STREETNUMBER,''),
isnull(PARSEDADDRESS.STREETNAME,ab.CLEANADDRESSBLOCK),
c.ISORGANIZATION,
c.ISGROUP,
c.ALIASID
from inserted
inner join deleted on deleted.ID = inserted.ID and deleted.CONSTITUENTID <> inserted.CONSTITUENTID
inner join dbo.V_CONSTITUENTALLNAMES c on c.ID = inserted.CONSTITUENTID
cross apply (select ltrim(rtrim(upper(replace(replace(replace(replace(replace(replace(replace(replace(
inserted.ADDRESSBLOCK,'.',''),'-',' '),',',' '),
char(13)+char(10),' '),char(10)+char(13),' '),char(13),' '),char(10),' '),' ',' ')))) CLEANADDRESSBLOCK) ab
outer apply (select left(CLEANADDRESSBLOCK,charindex(' ',CLEANADDRESSBLOCK)-1) STREETNUMBER,
right(CLEANADDRESSBLOCK,len(CLEANADDRESSBLOCK)-charindex(' ',CLEANADDRESSBLOCK)) STREETNAME
where dbo.UFN_REGULAREXPRESSIONMATCH('(?:^[A-Z]?[\d-]+[A-Z]? (?:.|\n)+$)',CLEANADDRESSBLOCK) = 1
and charindex(' ',CLEANADDRESSBLOCK)<=13) PARSEDADDRESS
where c.KEYNAME<>''
end
end
if update(ADDRESSBLOCK) or update(POSTCODE) or update(COUNTRYID)
begin
update dbo.SEARCHCONSTITUENT
set COUNTRYID = inserted.COUNTRYID,
POSTCODE = case when ltrim(rtrim(inserted.POSTCODE)) like '[0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]' then left(ltrim(inserted.POSTCODE),5) else ltrim(rtrim(inserted.POSTCODE)) end,
STREETNUMBER = isnull(PARSEDADDRESS.STREETNUMBER,''),
STREETNAME = isnull(PARSEDADDRESS.STREETNAME,ab.CLEANADDRESSBLOCK)
from inserted
cross apply (select ltrim(rtrim(upper(replace(replace(replace(replace(replace(replace(replace(replace(
inserted.ADDRESSBLOCK,'.',''),'-',' '),',',' '),
char(13)+char(10),' '),char(10)+char(13),' '),char(13),' '),char(10),' '),' ',' ')))) CLEANADDRESSBLOCK) ab
outer apply (select left(CLEANADDRESSBLOCK,charindex(' ',CLEANADDRESSBLOCK)-1) STREETNUMBER,
right(CLEANADDRESSBLOCK,len(CLEANADDRESSBLOCK)-charindex(' ',CLEANADDRESSBLOCK)) STREETNAME
where dbo.UFN_REGULAREXPRESSIONMATCH('(?:^[A-Z]?[\d-]+[A-Z]? (?:.|\n)+$)',CLEANADDRESSBLOCK) = 1
and charindex(' ',CLEANADDRESSBLOCK)<=13) PARSEDADDRESS
where SEARCHCONSTITUENT.ADDRESSID = inserted.ID
end
end
end