USP_REPORT_DUPLICATECONSTITUENTSREPORT
Returns the data necessary for the Duplicate Constituent Report
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@TABLENAME | nvarchar(200) | IN | |
@REPORTUSERID | nvarchar(128) | IN | |
@ALTREPORTUSERID | nvarchar(128) | IN | |
@CONSTITUENTQUERY | uniqueidentifier | IN | |
@CONSTITUENTID | uniqueidentifier | IN | |
@RECORDSECURITYCONSTITUENTDUPLICATEMATCHING | bit | IN |
Definition
Copy
CREATE procedure dbo.USP_REPORT_DUPLICATECONSTITUENTSREPORT
(
@TABLENAME nvarchar(200),
@REPORTUSERID nvarchar(128) = null,
@ALTREPORTUSERID nvarchar(128) = null,
@CONSTITUENTQUERY uniqueidentifier = null,
@CONSTITUENTID uniqueidentifier = null,
@RECORDSECURITYCONSTITUENTDUPLICATEMATCHING bit = 0
)
with execute as owner
as
--Build smart security clauses
declare @CURRENTAPPUSERID uniqueidentifier = dbo.UFN_APPUSER_GETREPORTAPPUSERID(@REPORTUSERID, @ALTREPORTUSERID);
declare @ISADMIN bit = dbo.UFN_APPUSER_ISSYSADMIN(@CURRENTAPPUSERID);
declare @SECURITY_DECLARATIONS nvarchar(300) = '';
declare @SECURITY_WHERECLAUSE nvarchar(600) = '';
if @ISADMIN = 0
begin
declare @APPUSER_IN_NONRACROLE bit = dbo.UFN_SECURITY_APPUSER_IN_NONRACROLE(@CURRENTAPPUSERID);
declare @APPUSER_IN_NONSITEROLE bit = dbo.UFN_SECURITY_APPUSER_IN_NONSITEROLE(@CURRENTAPPUSERID);
if @RECORDSECURITYCONSTITUENTDUPLICATEMATCHING = 1
begin
--This is CLR SP that create new groups based on site security
exec USP_REPORT_DUPLICATECONSTITUENTSREPORT_SITE @TABLENAME=@TABLENAME,@REPORTUSERID=@REPORTUSERID, @ALTREPORTUSERID=@ALTREPORTUSERID;
--This is new table created from above CLR SP and used to populate report
set @TABLENAME = @TABLENAME + '_DATA_' + replace(Convert(nvarchar(256),@CURRENTAPPUSERID),'-','_')
end
if @APPUSER_IN_NONRACROLE = 0 or @APPUSER_IN_NONSITEROLE = 0
begin
set @SECURITY_WHERECLAUSE = @SECURITY_WHERECLAUSE + 'where '
if @APPUSER_IN_NONRACROLE = 0
begin
set @SECURITY_DECLARATIONS = @SECURITY_DECLARATIONS + 'declare @APPUSER_IN_NOSECGROUPROLE bit = dbo.UFN_SECURITY_APPUSER_IN_NO_SECURITY_GROUP_ROLE(@CURRENTAPPUSERID);' + CHAR(13);
set @SECURITY_WHERECLAUSE = @SECURITY_WHERECLAUSE + 'dbo.UFN_SECURITY_APPUSER_GRANTED_CONSTITID_FORREPORT(@CURRENTAPPUSERID, dupes.CONSTITID, @APPUSER_IN_NOSECGROUPROLE) = 1' + CHAR(13);
if @TABLENAME = 'FINDDIFFERENTIALDUPLICATERESULTS'
set @SECURITY_WHERECLAUSE = @SECURITY_WHERECLAUSE + 'and dbo.UFN_SECURITY_APPUSER_GRANTED_CONSTITID_FORREPORT(@CURRENTAPPUSERID, dupes._key_CONSTITID, @APPUSER_IN_NOSECGROUPROLE) = 1' + CHAR(13);
end
if @APPUSER_IN_NONSITEROLE = 0
begin
if @APPUSER_IN_NONRACROLE = 0
set @SECURITY_WHERECLAUSE = @SECURITY_WHERECLAUSE + 'and '
set @SECURITY_DECLARATIONS = @SECURITY_DECLARATIONS + 'declare @APPUSER_IN_NOSITEROLE bit = dbo.UFN_SECURITY_APPUSER_IN_NO_SITE_ROLE(@CURRENTAPPUSERID);' + CHAR(13);
set @SECURITY_WHERECLAUSE = @SECURITY_WHERECLAUSE + 'dbo.UFN_SECURITY_APPUSER_GRANTED_CONSTITID_FORREPORT_BYSITE(@CURRENTAPPUSERID, dupes.CONSTITID, @APPUSER_IN_NOSITEROLE) = 1' + CHAR(13);
if @TABLENAME = 'FINDDIFFERENTIALDUPLICATERESULTS'
set @SECURITY_WHERECLAUSE = @SECURITY_WHERECLAUSE + 'and dbo.UFN_SECURITY_APPUSER_GRANTED_CONSTITID_FORREPORT_BYSITE(@CURRENTAPPUSERID, dupes._key_CONSTITID, @APPUSER_IN_NOSITEROLE) = 1' + CHAR(13);
end
end
end
declare @SQLTOEXEC nvarchar(max);
set @SQLTOEXEC = '
if exists(select name from sysobjects where name = N''' + @TABLENAME + ''' and type = ''U'')
begin
' + @SECURITY_DECLARATIONS + '
select
''http://www.blackbaud.com/CONSTITID?CONSTITID='' + CONVERT(nvarchar(36),c.id) as CONSTITID,
dupes._key_in,
dupes._key_out,
dupes._score,
c.NAME + dbo.UFN_SUFFIXCODE_GETDESCRIPTION(c.SUFFIXCODEID) as NAME,
dbo.UFN_BUILDFULLADDRESS(a.ID, a.ADDRESSBLOCK, a.CITY, a.STATEID, a.POSTCODE, a.COUNTRYID) as ADDRESS,
case
when canonicalconstituent.ID is not null then canonicalconstituent.NAME + dbo.UFN_SUFFIXCODE_GETDESCRIPTION(canonicalconstituent.SUFFIXCODEID)
else c.NAME + dbo.UFN_SUFFIXCODE_GETDESCRIPTION(c.SUFFIXCODEID)
end as CANONICALCONSTITUENTSNAME,
C.LOOKUPID,
case
when canonicalconstituent.ID is not null then canonicalconstituent.LOOKUPID
else c.LOOKUPID
end as CANONICALLOOKUPID,
C.KEYNAME
from
dbo.' + @TABLENAME + ' dupes
inner join dbo.CONSTITUENT c on c.ID = dupes.CONSTITID
left join ' + @TABLENAME + ' canonicalrow
on canonicalrow._key_in = dupes._key_out
left join dbo.CONSTITUENT canonicalconstituent
on canonicalconstituent.ID = canonicalrow.CONSTITID
left outer join
dbo.ADDRESS a on a.CONSTITUENTID = c.ID and a.ISPRIMARY = 1
';
declare @DBOBJECTNAME nvarchar(128);
declare @DBOBJECTTYPE smallint;
if @CONSTITUENTQUERY is not null
begin
if not exists(select ID from dbo.IDSETREGISTER where ID = @CONSTITUENTQUERY) raiserror('ID set does not exist in the database.', 15, 1);
select @DBOBJECTNAME = DBOBJECTNAME, @DBOBJECTTYPE = OBJECTTYPE from dbo.IDSETREGISTER where ID = @CONSTITUENTQUERY;
if @DBOBJECTTYPE = 1 set @DBOBJECTNAME = @DBOBJECTNAME + '()';
else if @DBOBJECTTYPE = 2 set @DBOBJECTNAME = @DBOBJECTNAME + '(''' + convert(nvarchar(36), @CONSTITUENTQUERY) + ''')';
set @SQLTOEXEC = @SQLTOEXEC + 'inner join dbo.' + @DBOBJECTNAME + ' as SELECTION on canonicalconstituent.ID = SELECTION.ID' + nchar(13);
end
set @SQLTOEXEC = @SQLTOEXEC + @SECURITY_WHERECLAUSE;
if @CONSTITUENTID is not null
begin
if @SECURITY_WHERECLAUSE = ''
begin
set @SQLTOEXEC = @SQLTOEXEC + nchar(13) + 'where canonicalconstituent.ID = @CONSTITUENTID';
end
else
begin
set @SQLTOEXEC = @SQLTOEXEC + nchar(13) + 'and canonicalconstituent.ID = @CONSTITUENTID';
end
end
set @SQLTOEXEC = @SQLTOEXEC + nchar(13) + '
end
else
begin
declare @msg nvarchar(400)
set @msg = ''You must successfully run the necessary duplicate constituent search package in SQL Server Integration Services before running this report. Contact your IT staff for assistance with running a package in SQL Server Integration Services.''
raiserror(N''%s'', 15, 1, @msg)
end'
exec sp_executesql @SQLTOEXEC, N'@CURRENTAPPUSERID uniqueidentifier, @CONSTITUENTID uniqueidentifier', @CURRENTAPPUSERID = @CURRENTAPPUSERID, @CONSTITUENTID = @CONSTITUENTID;
--Drop user table created
if @RECORDSECURITYCONSTITUENTDUPLICATEMATCHING = 1 and CHARINDEX('_DATA_',@TABLENAME) > 0
begin
set @SQLTOEXEC = 'if object_id('''+ @TABLENAME +''') is not null
drop table ' + @TABLENAME+ ';'
exec sp_executesql @SQLTOEXEC, N'@TABLENAME nvarchar(256)', @TABLENAME = @TABLENAME;
end