UFN_FINDADDRESSMATCH_CONSTITUENTUPDATEBATCH2
Return
Return Type |
---|
table |
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@CONSTITUENTID | uniqueidentifier | IN | |
@ADDRESSBLOCK | nvarchar(150) | IN | |
@POSTCODE | nvarchar(12) | IN | |
@COUNTRYID | uniqueidentifier | IN | |
@CITY | nvarchar(50) | IN | |
@STATEID | uniqueidentifier | IN | |
@ADDRESSTYPECODEID | uniqueidentifier | IN | |
@ADDRESSMATCHTHRESHOLD | tinyint | IN | |
@BATCHCONSTITUENTUPDATEID | uniqueidentifier | IN | |
@HISTORICALENDDATE | date | IN |
Definition
Copy
CREATE function dbo.UFN_FINDADDRESSMATCH_CONSTITUENTUPDATEBATCH2(
@CONSTITUENTID uniqueidentifier, --constituent ID we are trying to find an address matching the rest of the parameters.
@ADDRESSBLOCK nvarchar(150),
@POSTCODE nvarchar(12),
@COUNTRYID uniqueidentifier,
@CITY nvarchar(50),
@STATEID uniqueidentifier,
@ADDRESSTYPECODEID uniqueidentifier,
@ADDRESSMATCHTHRESHOLD tinyint,
@BATCHCONSTITUENTUPDATEID uniqueidentifier, -- Batch row ID to keep track of addresses that are already in the batch.
@HISTORICALENDDATE date
)
returns @MATCH table (
ADDRESSID uniqueidentifier,
NOCONFLICTS bit,
STREETNUMBERRESULT tinyint,
STREETNAMERESULT tinyint,
POSTCODERESULT tinyint
)
as
begin
declare @MATCHES table (ADDRESSID uniqueidentifier,
COMPOSITESCORE tinyint,
STREETNUMBERRESULT tinyint,
STREETNAMERESULT tinyint,
POSTCODERESULT tinyint,
STREETNUMBERSCORE tinyint,
STREETNAMESCORE tinyint,
POSTCODESCORE tinyint,
NOCONFLICTS bit,
ISPRIMARY bit,
HISTORICALENDDATE date,
DATECHANGED datetime,
ADDRESSTYPECODEID uniqueidentifier,
ADDRESSBLOCK nvarchar(150)
);
declare @BESTMATCHID uniqueidentifier;
-- Clean incoming data
declare @STREETNUMBER nvarchar(12),
@STREETNAME nvarchar(150),
@CLEANPOSTCODE nvarchar(12)
select @STREETNUMBER = STREETNUMBER,
@STREETNAME = STREETNAME,
@CLEANPOSTCODE = POSTCODE
from dbo.UFN_CLEANCONSTITUENTSTRINGS_2(null, null, null, @ADDRESSBLOCK, @POSTCODE)
declare @LOGICALRESULTMAPPING dbo.UDT_GENERIC_NVARCHAR100_TINYINT;
insert into @LOGICALRESULTMAPPING
select CASENAME, RESULTCODE
from dbo.CONSTITUENTMATCHLOGICALRESULTMAPPING
if @ADDRESSMATCHTHRESHOLD is null
select @ADDRESSMATCHTHRESHOLD = ADDRESSMATCHTHRESHOLD
from dbo.CONSTITUENTDUPLICATESEARCHSETTINGS
where TRANSACTIONTYPE = 'Default Criteria'
order by DATECHANGED;
insert into @MATCHES (ADDRESSID, STREETNUMBERRESULT, STREETNAMERESULT, POSTCODERESULT,
STREETNUMBERSCORE, STREETNAMESCORE, POSTCODESCORE, COMPOSITESCORE)
select Addresses.ADDRESSID,
score.STREETNUMBERRESULT,
score.STREETNAMERESULT,
score.POSTCODERESULT,
score.STREETNUMBERSCORE,
score.STREETNAMESCORE,
score.POSTCODESCORE,
score.COMPOSITESCORE
from (select SEARCHCONSTITUENT.ADDRESSID, SEARCHCONSTITUENT.STREETNUMBER, SEARCHCONSTITUENT.STREETNAME, SEARCHCONSTITUENT.POSTCODE, SEARCHCONSTITUENT.COUNTRYID, SEARCHCONSTITUENT.ISORGANIZATION
from dbo.SEARCHCONSTITUENT
where SEARCHCONSTITUENT.CONSTITUENTID = @CONSTITUENTID
and SEARCHCONSTITUENT.COUNTRYID = isnull(@COUNTRYID,SEARCHCONSTITUENT.COUNTRYID)
and SEARCHCONSTITUENT.POSTCODE3 = left(@CLEANPOSTCODE,3)
--do not want to re-match any addresses that are already in the batch, so we exclude them here by using the batch row ID.
and NOT EXISTS (select bcua.ADDRESSID from dbo.BATCHCONSTITUENTUPDATEADDRESSES bcua where bcua.BATCHCONSTITUENTUPDATEID = @BATCHCONSTITUENTUPDATEID and bcua.ADDRESSID = SEARCHCONSTITUENT.ADDRESSID)) Addresses
outer apply dbo.UFN_COMPARECONSTITUENTS_4(null, null, null, null, null, @STREETNUMBER, @STREETNAME, @CLEANPOSTCODE, null, null, null, null, null,
Addresses.STREETNUMBER, Addresses.STREETNAME, Addresses.POSTCODE, Addresses.COUNTRYID, 1, Addresses.ISORGANIZATION, @LOGICALRESULTMAPPING, @ADDRESSMATCHTHRESHOLD) score
where score.BAILEDCOMPARISON = 0;
delete from @MATCHES
where COMPOSITESCORE < (select max(COMPOSITESCORE) from @MATCHES);
-- only the best match or matches are left
-- determine whether there are conflicts or not
update matches
set NOCONFLICTS = case when matches.STREETNUMBERRESULT in(0,4,5,6) and
matches.STREETNAMERESULT in(0,4,5,6) and
matches.POSTCODERESULT in(0,4) and
(ADDRESS.CITY = @CITY or ADDRESS.CITY = '' or isnull(@CITY,'') = '') and
(ADDRESS.STATEID = @STATEID or ADDRESS.STATEID is null or @STATEID is null) and
(ADDRESS.ADDRESSTYPECODEID = @ADDRESSTYPECODEID or ADDRESS.ADDRESSTYPECODEID is null or @ADDRESSTYPECODEID is null) and
not (ADDRESS.HISTORICALENDDATE is not null and @HISTORICALENDDATE is null) then 1 else 0 end,
ISPRIMARY = ADDRESS.ISPRIMARY,
HISTORICALENDDATE = ADDRESS.HISTORICALENDDATE,
DATECHANGED = ADDRESS.DATECHANGED,
ADDRESSTYPECODEID = ADDRESS.ADDRESSTYPECODEID,
ADDRESSBLOCK = ADDRESS.ADDRESSBLOCK
from @MATCHES matches
inner join dbo.ADDRESS on ADDRESS.ID = matches.ADDRESSID;
declare @NULLVALUE uniqueidentifier = (select cast(cast(0 as binary) as uniqueidentifier))
insert into @MATCH
select top 1 ADDRESSID, NOCONFLICTS, STREETNUMBERRESULT, STREETNAMERESULT, POSTCODERESULT
from @MATCHES
order by NOCONFLICTS desc,
case when ADDRESSTYPECODEID = isnull(@ADDRESSTYPECODEID,@NULLVALUE) then 1 else 2 end,
case when isnull(@ADDRESSBLOCK,'') = isnull(ADDRESSBLOCK,'') then 1 else 2 end,
ISPRIMARY desc,
case when HISTORICALENDDATE is null then 1 else 2 end,
DATECHANGED desc
return;
end