UFN_BBNC_CONSTITDATA_MULTIPLE
Returns constituent data for a list of constituent IDs from Blackbaud Internet Solutions.
Return
Return Type |
---|
table |
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@IDLISTXML | xml | IN | |
@ORDERBYIDS | bit | IN | |
@BUSINESSPHONETYPECODEMAPID | int | IN |
Definition
Copy
CREATE function dbo.UFN_BBNC_CONSTITDATA_MULTIPLE
(
@IDLISTXML xml,
@ORDERBYIDS bit,
@BUSINESSPHONETYPECODEMAPID int = null
)
returns @CONSTITDATA table
(
CONSTIT_BBNCID int,
CONSTIT_BIRTHDATE dbo.UDT_FUZZYDATE,
CONSTIT_FIRSTNAME nvarchar(100),
CONSTIT_NAME nvarchar(300),
CONSTIT_GENDER nvarchar(20),
CONSTIT_KEYNAME nvarchar(100),
CONSTIT_MAIDENNAME nvarchar(100),
CONSTIT_MIDDLENAME nvarchar(100),
CONSTIT_NICKNAME nvarchar(100),
CONSTIT_TITLECODE nvarchar(50),
CONSTIT_TITLE2CODE nvarchar(50),
CONSTIT_SUFFIXCODE nvarchar(50),
CONSTIT_SUFFIX2CODE nvarchar(50),
CONSTIT_REQUESTNOEMAIL bit,
CONSTIT_LOOKUPID nvarchar(100),
CONSTIT_MARITALSTATUS nvarchar(50),
ALUMNI_CLASSOF dbo.UDT_YEAR,
ALUMNI_DATE_ENTERED dbo.UDT_FUZZYDATE,
ALUMNI_DATE_LEFT dbo.UDT_FUZZYDATE,
ALUMNI_DEGREE nvarchar(100),
ALUMNI_FRAT_SOR nvarchar(100),
ALUMNI_GPA decimal(3, 2),
ALUMNI_KNOWN_NAME nvarchar(100),
ALUMNI_SCHOOL_NAME nvarchar(100),
ALUMNI_SCHOOL_TYPE nvarchar(100),
ALUMNI_STATUS nvarchar(100),
ALUMNI_MAJOR nvarchar(50),
ALUMNI_MINOR nvarchar(50),
ADDRESS_COUNTRY nvarchar(100),
ADDRESS_COUNTRY_ABBREVIATION nvarchar(20),
ADDRESS_ADDRESSBLOCK nvarchar(150),
ADDRESS_CITY nvarchar(50),
ADDRESS_STATE nvarchar(50),
ADDRESS_POSTCODE nvarchar(20),
ADDRESS_FORMATTED_ADDRESS nvarchar(300),
ADDRESS_COUNTRYADDRESSFORMATID uniqueidentifier,
EMAIL_TYPE nvarchar(50),
EMAIL_ADDRESS nvarchar(200),
PHONE_TYPE nvarchar(50),
PHONE_NUMBER nvarchar(100),
BUSINESS_NAME nvarchar(100),
BUSINESS_POSITION nvarchar(100),
BUSINESS_INDUSTRY nvarchar(50),
BUSINESS_COUNTRY nvarchar(100),
BUSINESS_COUNTRY_ABBREVIATION nvarchar(20),
BUSINESS_ADDRESSBLOCK nvarchar(150),
BUSINESS_CITY nvarchar(50),
BUSINESS_STATE nvarchar(50),
BUSINESS_POSTCODE nvarchar(20),
BUSINESS_FORMATTED_ADDRESS nvarchar(300),
BUSINESS_COUNTRYADDRESSFORMATID uniqueidentifier,
BUSINESS_PHONE_TYPE nvarchar(50),
BUSINESS_PHONE_NUMBER nvarchar(100),
SPOUSE_TITLECODE nvarchar(50),
SPOUSE_TITLE2CODE nvarchar(50),
SPOUSE_FIRSTNAME nvarchar(100),
SPOUSE_MIDDLENAME nvarchar(100),
SPOUSE_KEYNAME nvarchar(100),
SPOUSE_MAIDENNAME nvarchar(100),
SPOUSE_SUFFIXCODE nvarchar(50),
SPOUSE_SUFFIX2CODE nvarchar(50),
SPOUSE_CLASSOF dbo.UDT_FUZZYDATE,
EMAIL_ADDRESS_SYSTEM_ID int
)
as
begin
declare @IDLIST table
(
ID int,
SEQUENCE int
);
insert into @IDLIST(ID, SEQUENCE)
select T.c.value('(ID)[1]', 'int') as [ID],
T.c.value('(SEQUENCE)[1]', 'int') as [SEQUENCE]
from @IDLISTXML.nodes('/IDLIST/ITEM') T(c)
--purposefully using DATE
declare @CURRENTDATE date;
set @CURRENTDATE = getdate();
declare @BUSINESSADDRESSTYPECODEID uniqueidentifier;
declare @BUSINESSPHONETYPECODEID uniqueidentifier;
declare @DONOTEMAILSOLICITCODEID uniqueidentifier;
select top 1
@BUSINESSADDRESSTYPECODEID = coalesce(BUSINESSADDRESSTYPECODEID, '00000000-0000-0000-0000-000000000000'),
@DONOTEMAILSOLICITCODEID = DONOTEMAILSOLICITCODEID
from dbo.NETCOMMUNITYDEFAULTCODEMAP;
set @BUSINESSPHONETYPECODEID = '00000000-0000-0000-0000-000000000000';
select top (1)
@BUSINESSPHONETYPECODEID = PHONETYPECODE.ID
from
dbo.BBNCCODETABLEIDMAP
inner join dbo.PHONETYPECODE on BBNCCODETABLEIDMAP.TABLEENTRYID = PHONETYPECODE.ID
where
BBNCCODETABLEIDMAP.ID = @BUSINESSPHONETYPECODEMAPID
order by
PHONETYPECODE.SEQUENCE;
insert into @CONSTITDATA(CONSTIT_BBNCID, CONSTIT_BIRTHDATE, CONSTIT_FIRSTNAME, CONSTIT_NAME, CONSTIT_GENDER, CONSTIT_KEYNAME, CONSTIT_MAIDENNAME, CONSTIT_MIDDLENAME, CONSTIT_NICKNAME,
CONSTIT_TITLECODE, CONSTIT_TITLE2CODE, CONSTIT_SUFFIXCODE, CONSTIT_SUFFIX2CODE, CONSTIT_REQUESTNOEMAIL, CONSTIT_LOOKUPID, CONSTIT_MARITALSTATUS,
ALUMNI_CLASSOF, ALUMNI_DATE_ENTERED, ALUMNI_DATE_LEFT, ALUMNI_DEGREE, ALUMNI_FRAT_SOR,
ALUMNI_GPA, ALUMNI_KNOWN_NAME, ALUMNI_SCHOOL_NAME, ALUMNI_SCHOOL_TYPE, ALUMNI_STATUS, ALUMNI_MAJOR, ALUMNI_MINOR,
ADDRESS_COUNTRY, ADDRESS_COUNTRY_ABBREVIATION, ADDRESS_ADDRESSBLOCK, ADDRESS_CITY, ADDRESS_STATE, ADDRESS_POSTCODE,
ADDRESS_FORMATTED_ADDRESS, ADDRESS_COUNTRYADDRESSFORMATID,
EMAIL_TYPE, EMAIL_ADDRESS, EMAIL_ADDRESS_SYSTEM_ID,
PHONE_TYPE, PHONE_NUMBER,
BUSINESS_NAME, BUSINESS_POSITION, BUSINESS_INDUSTRY, BUSINESS_COUNTRY, BUSINESS_COUNTRY_ABBREVIATION,
BUSINESS_ADDRESSBLOCK, BUSINESS_CITY, BUSINESS_STATE, BUSINESS_POSTCODE, BUSINESS_FORMATTED_ADDRESS,
BUSINESS_COUNTRYADDRESSFORMATID,
BUSINESS_PHONE_TYPE, BUSINESS_PHONE_NUMBER,
SPOUSE_TITLECODE, SPOUSE_TITLE2CODE, SPOUSE_FIRSTNAME, SPOUSE_MIDDLENAME, SPOUSE_KEYNAME, SPOUSE_MAIDENNAME, SPOUSE_SUFFIXCODE, SPOUSE_SUFFIX2CODE,
SPOUSE_CLASSOF)
select
CONSTITUENT.SEQUENCEID as [ID],
CONSTITUENT.BIRTHDATE,
CONSTITUENT.FIRSTNAME,
CONSTITUENT.NAME,
CONSTITUENT.GENDER,
CONSTITUENT.KEYNAME,
CONSTITUENT.MAIDENNAME,
CONSTITUENT.MIDDLENAME,
CONSTITUENT.NICKNAME,
TITLECODE.DESCRIPTION as TITLECODE,
TITLE2CODE.DESCRIPTION as TITLE2CODE,
SUFFIXCODE.DESCRIPTION as SUFFIXCODE,
SUFFIX2CODE.DESCRIPTION as SUFFIX2CODE,
--check for the appropriate solicit code for REQUESTNOEMAIL
case when (csc.ID is null) then 0 else 1 end as REQUESTNOEMAIL,
CONSTITUENT.LOOKUPID,
MARITALSTATUSCODE.DESCRIPTION as MARITALSTATUSCODE,
coalesce(EDUCATIONALHISTORY.CLASSOF, 0),
coalesce(EDUCATIONALHISTORY.STARTDATE, '00000000'),
coalesce(EDUCATIONALHISTORY.ENDDATE, '00000000'),
EDUCATIONALDEGREECODE.DESCRIPTION,
EDUCATIONALHISTORY.FRATERNITY,
EDUCATIONALHISTORY.GPA,
EDUCATIONALHISTORY.KNOWNNAME,
EDUCATIONALINSTITUTION.NAME,
EDUCATIONALHISTORYTYPECODE.DESCRIPTION,
EDUCATIONALHISTORY.CONSTITUENCYSTATUS,
EDUCATIONALMAJORCODE.DESCRIPTION,
EDUCATIONALMINORCODE.DESCRIPTION,
COUNTRY.DESCRIPTION,
COUNTRY.ABBREVIATION,
ADDRESS.ADDRESSBLOCK,
ADDRESS.CITY,
case
--TMV 04/11/2007 CR272266-040907 BBNC expects the full description for New Zealand city, GUID copied from dbo.USP_COUNTRYADDRESSFORMAT_GETDATA.
--TMV 04/13/2007 CR272671-041207 BBNC expects the full description for United Kingdom county, GUID copied from dbo.USP_COUNTRYADDRESSFORMAT_GETDATA.
when
(
COUNTRY.COUNTRYADDRESSFORMATID = '959809FB-8FA7-4A19-888F-9951BD9B29D3' --United Kingdom
or
COUNTRY.COUNTRYADDRESSFORMATID = 'A3B050A5-E1C8-4E1B-99AE-40E9FCADA0BC' --New Zealand
)
then
STATE.DESCRIPTION
else
STATE.ABBREVIATION
end,
ADDRESS.POSTCODE,
dbo.UFN_BUILDFULLADDRESS(ADDRESS.ID, ADDRESS.ADDRESSBLOCk, ADDRESS.CITY, ADDRESS.STATEID, ADDRESS.POSTCODE, ADDRESS.COUNTRYID),
COUNTRY.COUNTRYADDRESSFORMATID,
EMAILADDRESSTYPECODE.DESCRIPTION,
EMAILADDRESS.EMAILADDRESS,
EMAILMAP.ID,
PHONETYPECODE.DESCRIPTION,
PHONE.NUMBER,
[BUSINESS].NAME,
[BUSINESSRELATIONSHIPJOBINFO].JOBTITLE [POSITION],
INDUSTRYCODE.DESCRIPTION,
[BUSINESSCOUNTRY].DESCRIPTION,
[BUSINESSCOUNTRY].ABBREVIATION,
[BUSINESSADDRESS].ADDRESSBLOCK,
[BUSINESSADDRESS].CITY,
case
--TMV 04/11/2007 CR272266-040907 BBNC expects the full description for New Zealand city, GUID copied from dbo.USP_COUNTRYADDRESSFORMAT_GETDATA.
--TMV 04/13/2007 CR272671-041207 BBNC expects the full description for United Kingdom county, GUID copied from dbo.USP_COUNTRYADDRESSFORMAT_GETDATA.
when
(
[BUSINESSCOUNTRY].COUNTRYADDRESSFORMATID = '959809FB-8FA7-4A19-888F-9951BD9B29D3' --United Kingdom
or
[BUSINESSCOUNTRY].COUNTRYADDRESSFORMATID = 'A3B050A5-E1C8-4E1B-99AE-40E9FCADA0BC' --New Zealand
)
then
[BUSINESSSTATE].DESCRIPTION
else
[BUSINESSSTATE].ABBREVIATION
end,
[BUSINESSADDRESS].POSTCODE,
dbo.UFN_BUILDFULLADDRESS([BUSINESSADDRESS].ID, [BUSINESSADDRESS].ADDRESSBLOCK, [BUSINESSADDRESS].CITY, [BUSINESSADDRESS].STATEID, [BUSINESSADDRESS].POSTCODE, [BUSINESSADDRESS].COUNTRYID),
[BUSINESSCOUNTRY].COUNTRYADDRESSFORMATID,
[BUSINESSPHONETYPECODE].DESCRIPTION,
[BUSINESSPHONE].NUMBER,
[SPOUSETITLECODE].DESCRIPTION,
[SPOUSETITLE2CODE].DESCRIPTION,
[SPOUSE].FIRSTNAME,
[SPOUSE].MIDDLENAME,
[SPOUSE].KEYNAME,
[SPOUSE].MAIDENNAME,
[SPOUSESUFFIXCODE].DESCRIPTION,
[SPOUSESUFFIX2CODE].DESCRIPTION,
coalesce([SPOUSEEDUCATION].CLASSOF, 0)
from dbo.CONSTITUENT
inner join @IDLIST as [IDLIST] on [IDLIST].ID = CONSTITUENT.SEQUENCEID
left join dbo.TITLECODE on TITLECODE.ID = CONSTITUENT.TITLECODEID
left join dbo.TITLECODE TITLE2CODE on TITLECODE.ID = CONSTITUENT.TITLE2CODEID
left join dbo.SUFFIXCODE on SUFFIXCODE.ID = CONSTITUENT.SUFFIXCODEID
left join dbo.SUFFIXCODE SUFFIX2CODE on SUFFIXCODE.ID = CONSTITUENT.SUFFIX2CODEID
left join dbo.MARITALSTATUSCODE on MARITALSTATUSCODE.ID = CONSTITUENT.MARITALSTATUSCODEID
left join dbo.ADDRESS on ADDRESS.CONSTITUENTID = CONSTITUENT.ID and ADDRESS.ISPRIMARY = 1
left join dbo.COUNTRY on COUNTRY.ID = ADDRESS.COUNTRYID
left join dbo.STATE on STATE.ID = ADDRESS.STATEID
left join dbo.EMAILADDRESS on EMAILADDRESS.CONSTITUENTID = CONSTITUENT.ID and EMAILADDRESS.ISPRIMARY = 1
left join dbo.EMAILADDRESSTYPECODE on EMAILADDRESSTYPECODE.ID = EMAILADDRESS.EMAILADDRESSTYPECODEID
left join dbo.PHONE on PHONE.CONSTITUENTID = CONSTITUENT.ID and PHONE.ISPRIMARY = 1
left join dbo.PHONETYPECODE on PHONETYPECODE.ID = PHONE.PHONETYPECODEID
left join dbo.RELATIONSHIP as [BUSINESSRELATIONSHIP] on [BUSINESSRELATIONSHIP].RELATIONSHIPCONSTITUENTID = CONSTITUENT.ID and [BUSINESSRELATIONSHIP].ISPRIMARYBUSINESS = 1 and CONSTITUENT.ISORGANIZATION = 0
-- Note: Contrary to expectations, an organization constituent can have more than 1 relationship with ISPRIMARYBUSINESSRELATIONSHIP = 1.
-- So we need to pick the top 1. We can skip this check for individual constituents; a trigger on the relationship table will ensure that
-- individuals have at most 1 primary business relationship.
and (CONSTITUENT.ISORGANIZATION = 0 or [BUSINESSRELATIONSHIP].ID in (select top 1 ID from dbo.RELATIONSHIP where RELATIONSHIPCONSTITUENTID = CONSTITUENT.ID and RELATIONSHIP.ISPRIMARYBUSINESS = 1))
left join dbo.RELATIONSHIPJOBINFO as [BUSINESSRELATIONSHIPJOBINFO] on [BUSINESSRELATIONSHIP].RELATIONSHIPSETID = [BUSINESSRELATIONSHIPJOBINFO].RELATIONSHIPSETID
and @CURRENTDATE between coalesce([BUSINESSRELATIONSHIPJOBINFO].STARTDATE, @CURRENTDATE) and coalesce([BUSINESSRELATIONSHIPJOBINFO].ENDDATE, @CURRENTDATE)
left join dbo.CONSTITUENT as [BUSINESS] on [BUSINESS].ID = [BUSINESSRELATIONSHIP].RECIPROCALCONSTITUENTID
left join dbo.ORGANIZATIONDATA on ORGANIZATIONDATA.ID = [BUSINESS].ID
left join dbo.INDUSTRYCODE on INDUSTRYCODE.ID = ORGANIZATIONDATA.INDUSTRYCODEID
left join dbo.ADDRESS as [BUSINESSADDRESS] on -- Pull the address from the constituent, not their business. A constituent can have more than one address with the same type, choose the match that would appear first in the address data list.
[BUSINESSADDRESS].ID in (select top 1 ID from dbo.ADDRESS where CONSTITUENTID = CONSTITUENT.ID and ADDRESSTYPECODEID = @BUSINESSADDRESSTYPECODEID order by ISPRIMARY desc, SEQUENCE)
left join dbo.COUNTRY as [BUSINESSCOUNTRY] on [BUSINESSCOUNTRY].ID = [BUSINESSADDRESS].COUNTRYID
left join dbo.STATE as [BUSINESSSTATE] on [BUSINESSSTATE].ID = [BUSINESSADDRESS].STATEID
left join dbo.PHONE as [BUSINESSPHONE] on -- Pull the phone from the constituent, not their business. A constituent can have more than one phone with the same type, choose the match that would appear first in the phone data list.
[BUSINESSPHONE].ID in (select top 1 ID from dbo.PHONE where CONSTITUENTID = CONSTITUENT.ID and PHONETYPECODEID = @BUSINESSPHONETYPECODEID order by ISPRIMARY desc, SEQUENCE)
left join dbo.PHONETYPECODE as [BUSINESSPHONETYPECODE] on [BUSINESSPHONETYPECODE].ID = [BUSINESSPHONE].PHONETYPECODEID
left join dbo.RELATIONSHIP as [SPOUSERELATIONSHIP] on [SPOUSERELATIONSHIP].RELATIONSHIPCONSTITUENTID = CONSTITUENT.ID and [SPOUSERELATIONSHIP].ISSPOUSE = 1
left join dbo.CONSTITUENT as [SPOUSE] on [SPOUSE].ID = [SPOUSERELATIONSHIP].RECIPROCALCONSTITUENTID
left join dbo.TITLECODE as [SPOUSETITLECODE] on [SPOUSETITLECODE].ID = [SPOUSE].TITLECODEID
left join dbo.TITLECODE as [SPOUSETITLE2CODE] on [SPOUSETITLE2CODE].ID = [SPOUSE].TITLE2CODEID
left join dbo.SUFFIXCODE as [SPOUSESUFFIXCODE] on [SPOUSESUFFIXCODE].ID = [SPOUSE].SUFFIXCODEID
left join dbo.SUFFIXCODE as [SPOUSESUFFIX2CODE] on [SPOUSESUFFIX2CODE].ID = [SPOUSE].SUFFIX2CODEID
left join dbo.EDUCATIONALHISTORY as [SPOUSEEDUCATION] on [SPOUSEEDUCATION].CONSTITUENTID = [SPOUSE].ID and [SPOUSEEDUCATION].ISPRIMARYRECORD = 1
left join dbo.EDUCATIONALHISTORY on EDUCATIONALHISTORY.CONSTITUENTID = CONSTITUENT.ID and EDUCATIONALHISTORY.ISPRIMARYRECORD = 1
left join dbo.EDUCATIONALINSTITUTION on EDUCATIONALINSTITUTION.ID = EDUCATIONALHISTORY.EDUCATIONALINSTITUTIONID
left join dbo.EDUCATIONALHISTORYTYPECODE on EDUCATIONALHISTORYTYPECODE.ID = EDUCATIONALHISTORY.EDUCATIONALHISTORYTYPECODEID
left join dbo.EDUCATIONALDEGREECODE on EDUCATIONALDEGREECODE.ID = EDUCATIONALHISTORY.EDUCATIONALDEGREECODEID
left join dbo.EDUCATIONALMAJOR on EDUCATIONALMAJOR.EDUCATIONALHISTORYID = EDUCATIONALHISTORY.ID
--Note: There can be multiple major for a single EDUCATIONALHISTORY record. This should pick out the top 1 of those for the join; I'm
--not sure about the performance implications, though. SQLServer should short-circut the 'and' if there's no major for the
--educationalhistory row. The same technique is used for minors below
and EDUCATIONALMAJOR.ID in (select top 1 ID from dbo.EDUCATIONALMAJOR where EDUCATIONALMAJOR.EDUCATIONALHISTORYID = EDUCATIONALHISTORY.ID)
left join dbo.EDUCATIONALMINOR on EDUCATIONALMINOR.EDUCATIONALHISTORYID = EDUCATIONALHISTORY.ID
and EDUCATIONALMINOR.ID in (select top 1 ID from dbo.EDUCATIONALMINOR where EDUCATIONALMINOR.EDUCATIONALHISTORYID = EDUCATIONALHISTORY.ID)
left join dbo.EDUCATIONALMAJORCODE on EDUCATIONALMAJORCODE.ID = EDUCATIONALMAJOR.EDUCATIONALMAJORCODEID
left join dbo.EDUCATIONALMAJORCODE as [EDUCATIONALMINORCODE] on [EDUCATIONALMINORCODE].ID = EDUCATIONALMINOR.EDUCATIONALMAJORCODEID
--Only join if the solicit code is the one that flags do not email.
left join dbo.CONSTITUENTSOLICITCODE as csc on
csc.CONSTITUENTID=CONSTITUENT.ID and
csc.SOLICITCODEID=@DONOTEMAILSOLICITCODEID and
((csc.STARTDATE is null) or (datediff(day, csc.STARTDATE, getdate())>=0)) and
((csc.ENDDATE is null) or (datediff(day, getdate(), csc.ENDDATE)>=0))
left join dbo.BBNCCODETABLEIDMAP EMAILMAP on EMAILMAP.TABLEENTRYID = EMAILADDRESSTYPECODE.ID
order by
case when @ORDERBYIDS = 0 then CONSTITUENT.KEYNAME end,
case when @ORDERBYIDS = 1 then [IDLIST].SEQUENCE end;
--TMV 06/21/2007 CR277591-062007 Separate case statements must be used in a dynamic order by clause with incompatible data types.
return;
end