• As requested here is the complete sproc:

    CREATE PROCEDURE [dbo].[usp_GenerateKeys]

    @SourceTable VARCHAR(50)

    AS

    BEGIN

    SET NOCOUNT ON

    DECLARE @SQL NVARCHAR(MAX)

    DECLARE @MSG NVARCHAR(500)

    -- Get source table unique reference

    IF EXISTS (SELECT 1 FROM sys.tables WHERE name = 'FieldMappings')

    DROP TABLE dbo.FieldMappings

    select Label, FieldOrder into dbo.FieldMappings

    from [Snapshot_MeritDirect].dbo.BFieldTypes

    WHERE Label in (select column_name from Snapshot_MeritDirect_Load.INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = @SourceTable)

    -- We need a table to hold all the fields and their definsitions, then based on what columns

    -- the staging file has, we build the keys table

    DECLARE @SourceTableUniqueReference VARCHAR(50)

    -- Used to generate the insert into the keys table

    DECLARE @InsertIntoPart VARCHAR(4000) = ''

    DECLARE @SelectPart VARCHAR(4000) = ''

    DECLARE @FromPart VARCHAR(4000) = ''

    DECLARE @CROSSAPPLY VARCHAR(200) = ''

    -- Person name details

    DECLARE @mkNameKeySELECTString VARCHAR(800) = 'NULL'

    DECLARE @mkName1SELECTString VARCHAR(800) = 'NULL'

    DECLARE @mkName2SELECTString VARCHAR(800) = 'NULL'

    DECLARE @mkName3SELECTString VARCHAR(800) = 'NULL'

    DECLARE @mkNormalisedName VARCHAR(800) = 'NULL'

    -- Company specific keys

    DECLARE @mkOrgNameKeyString VARCHAR(800) = 'NULL'

    DECLARE @mkOrgNameSELECTString VARCHAR(800) = 'NULL'

    DECLARE @mkOrgName1SELECTString VARCHAR(800) = 'NULL'

    DECLARE @mkOrgName2SELECTString VARCHAR(800) = 'NULL'

    DECLARE @mkOrgName3SELECTString VARCHAR(800) = 'NULL'

    DECLARE @mkNormalisedOrganisation VARCHAR(800) = 'NULL'

    -- Address specific details

    DECLARE @mkPostInSELECTString NVARCHAR(800) = 'NULL'

    DECLARE @mkPostOutSELECTString NVARCHAR(800) = 'NULL'

    DECLARE @mkPhoneticStreetSELECTString NVARCHAR(800) = 'NULL'

    DECLARE @mkPremiseSELECTString NVARCHAR(800) = 'NULL'

    DECLARE @mkTownSELECTString NVARCHAR(800) = 'NULL'

    SET @SourceTableUniqueReference = 'ID, GUID '

    ---- If we already have First and Last names then there is no need to split the names

    IF EXISTS (SELECT 1 FROM dbo.FieldMappings WHERE Label = 'Forename')

    AND EXISTS (SELECT 1 FROM dbo.FieldMappings WHERE Label = 'Surname')

    BEGIN

    -- Phonetic Surname + First letter of Forename

    SET @mkNameKeySELECTString = 'dbo.clrFn_DoubleMetaphone(dbo.GetLastWord(Surname) + LEFT(dbo.GetFirstWord(Forename), 1))'

    -- Phonetic Surname

    SET @mkName1SELECTString = 'dbo.clrFn_DoubleMetaphone(Surname)'

    -- Phonetic Forename

    SET @mkName2SELECTString = 'dbo.clrFn_DoubleMetaphone(dbo.GetFirstWord(Forename))'

    -- Phonetic Middle name or Initial

    SET @mkName3SELECTString = 'dbo.clrFn_DoubleMetaphone(dbo.GetSecondWord(Forename))'

    -- Normalised name = Surname + Forename + Middle Name

    SET @mkNormalisedName = 'dbo.GetLastWord(Surname) + '','' + dbo.GetFirstWord(Forename) + '','' + dbo.GetSecondWord(Forename)'

    END

    else IF EXISTS (SELECT 1 FROM dbo.FieldMappings WHERE Label = 'Forename')

    AND NOT EXISTS (SELECT 1 FROM dbo.FieldMappings WHERE Label = 'Surname')

    BEGIN

    -- Phonetic Surname + First letter of Forename

    SET @mkNameKeySELECTString = 'NULL'

    -- Phonetic Surname

    SET @mkName1SELECTString = 'NULL'

    -- Phonetic Forename

    SET @mkName2SELECTString = 'dbo.clrFn_DoubleMetaphone(dbo.GetFirstWord(Forename))'

    -- Phonetic Middle name or Initial

    SET @mkName3SELECTString = 'dbo.clrFn_DoubleMetaphone(dbo.GetSecondWord(Forename))'

    -- Normalised name = Forename + Middle Name

    SET @mkNormalisedName = 'dbo.GetFirstWord(Forename) + '','' + dbo.GetSecondWord(Forename)'

    END

    else IF NOT EXISTS (SELECT 1 FROM dbo.FieldMappings WHERE Label = 'Forename')

    AND EXISTS (SELECT 1 FROM dbo.FieldMappings WHERE Label = 'Surname')

    BEGIN

    -- Phonetic Surname + First letter of Forename

    SET @mkNameKeySELECTString = 'dbo.clrFn_DoubleMetaphone(dbo.GetLastWord(Surname))'

    -- Phonetic Surname

    SET @mkName1SELECTString = 'dbo.clrFn_DoubleMetaphone(dbo.GetLastWord(Surname))'

    -- Phonetic Forename

    SET @mkName2SELECTString = 'NULL'

    -- Phonetic Middle name or Initial

    SET @mkName3SELECTString = 'NULL'

    -- Normalised name = Surname

    SET @mkNormalisedName = 'dbo.GetLastWord(Surname) '

    END

    ELSE IF EXISTS (SELECT 1 FROM dbo.FieldMappings WHERE Label = 'FullContactName')

    BEGIN

    -- Phonetic Surname + First letter of Forename

    SET @mkNameKeySELECTString = 'dbo.clrFn_DoubleMetaphone(dbo.GetLastWord(FullContactName) + LEFT(dbo.GetFirstWord(FullContactName), 1))'

    -- Phonetic Surname

    SET @mkName1SELECTString = 'dbo.clrFn_DoubleMetaphone(dbo.GetLastWord(FullContactName))'

    -- Phonetic Forename

    SET @mkName2SELECTString = 'dbo.clrFn_DoubleMetaphone(dbo.GetFirstWord(FullContactName))'

    -- Phonetic Middle name or Initial

    SET @mkName3SELECTString = 'dbo.clrFn_DoubleMetaphone(dbo.GetSecondWord(FullContactName))'

    -- Normalised name = Surname + Forename + Middle Name

    SET @mkNormalisedName = 'dbo.GetLastWord(FullContactName) + '','' + dbo.GetFirstWord(FullContactName) + '','' + dbo.GetSecondWord(FullContactName)'

    END

    ELSE

    BEGIN

    SET @MSG = N'No Forename, Surname or Full Contact Details present in the table.'

    RAISERROR(@MSG,16,1);

    RETURN

    END

    -- If we have compnay details then we need to break this down into 4 different keys

    -- mkOrganisation

    -- mkOrgName1

    -- mkOrgName2

    -- mkOrgName3

    IF EXISTS (SELECT 1 FROM dbo.FieldMappings WHERE Label = 'OrganisationName')

    BEGIN

    SET @mkOrgNameKeyString = 'dbo.clrFn_DoubleMetaphone(ISNULL(dbo.fn_NormaliseOrgName(OrganisationName, 0), ''''))'

    SET @mkNormalisedOrganisation = 'dbo.fn_NormaliseOrgName(OrganisationName, 0)'

    SET @mkOrgName1SELECTString = 'dbo.clrFn_DoubleMetaphone(dbo.fn_NormaliseOrgName(OrganisationName, 1))'

    SET @mkOrgName2SELECTString = 'dbo.clrFn_DoubleMetaphone(dbo.fn_NormaliseOrgName(OrganisationName, 2))'

    SET @mkOrgName3SELECTString = 'dbo.clrFn_DoubleMetaphone(dbo.fn_NormaliseOrgName(OrganisationName, 3))'

    END

    IF EXISTS (SELECT 1 FROM dbo.FieldMappings WHERE Label = 'Postcode')

    BEGIN

    SET @mkPostInSELECTString = 'dbo.fn_PostCodeSplitter(Postcode, 1)'

    SET @mkPostOutSELECTString = 'dbo.fn_PostCodeSplitter(Postcode, 2)'

    END

    IF EXISTS (SELECT 1 FROM dbo.FieldMappings WHERE Label = 'Address1')

    BEGIN

    IF EXISTS (SELECT 1 FROM dbo.FieldMappings WHERE Label = 'Buildingname')

    BEGIN

    SET @mkPhoneticStreetSELECTString = 'dbo.clrFn_DoubleMetaphone(dbo.fnStripString(Buildingname + '' '' + Address1))'

    SET @CROSSAPPLY = ' CROSS APPLY dbo.GetNumbersFromText(isnull(Buildingname, '''') + '' '' + Address1) AS a '

    SET @mkPremiseSELECTString = 'a.number'

    END

    ELSE

    BEGIN

    SET @mkPhoneticStreetSELECTString = 'dbo.clrFn_DoubleMetaphone(dbo.fnStripString(Address1))'

    SET @CROSSAPPLY = ' CROSS APPLY dbo.GetNumbersFromText(Address1) AS a '

    SET @mkPremiseSELECTString = 'a.number'

    END

    END

    IF EXISTS (SELECT 1 FROM dbo.FieldMappings WHERE Label = 'Town')

    BEGIN

    SET @mkTownSELECTString = 'dbo.clrFn_DoubleMetaphone(dbo.fnStripString(Town))'

    END

    SET @InsertIntoPart = 'INSERT INTO dbo.' + @SourceTable + '_keys_ (ID, GUID, mkNameKey, mkName1, mkName2, mkName3, mkNormalizedName, mkOrganizationKey,

    mkNormalizedOrganization, mkOrgName1, mkOrgName2, mkorgName3, mkPostIn, mkPostOut, mkPhoneticStreet, mkPremise, mkPhoneticTown)'

    ---- some more processing on the keys before we insert into the keys table

    set @mkNameKeySELECTString = 'CASE WHEN LEN(replace(' + @mkNameKeySELECTString + ', '' '', '''')) >=8 THEN LEFT(replace(' + @mkNameKeySELECTString + ', '' '', ''''), 8) ELSE replace(' + @mkNameKeySELECTString + ', '' '', '''') END'

    set @mkName1SELECTString = 'CASE WHEN LEN(replace(' + @mkName1SELECTString + ', '' '', '''')) >=8 THEN LEFT(replace(' + @mkName1SELECTString + ', '' '', ''''), 8) ELSE replace(' + @mkName1SELECTString + ', '' '', '''') END'

    set @mkName2SELECTString = 'CASE WHEN LEN(replace(' + @mkName2SELECTString + ', '' '', '''')) >=8 THEN LEFT(replace(' + @mkName2SELECTString + ', '' '', ''''), 8) ELSE replace(' + @mkName2SELECTString + ', '' '', '''') END'

    set @mkName3SELECTString = 'CASE WHEN LEN(replace(' + @mkName3SELECTString + ', '' '', '''')) >=8 THEN LEFT(replace(' + @mkName3SELECTString + ', '' '', ''''), 8) ELSE replace(' + @mkName3SELECTString + ', '' '', '''') END'

    set @mkPhoneticStreetSELECTString = 'CASE WHEN LEN(replace(' + @mkPhoneticStreetSELECTString + ', '' '', '''')) >=8 THEN LEFT(replace(' + @mkPhoneticStreetSELECTString + ', '' '', ''''), 8) ELSE replace(' + @mkPhoneticStreetSELECTString + ', '' '', '''') END'

    set @mkTownSELECTString = 'CASE WHEN LEN(replace(' + @mkTownSELECTString + ', '' '', '''')) >=8 THEN LEFT(replace(' + @mkTownSELECTString + ', '' '', ''''), 8) ELSE replace(' + @mkTownSELECTString + ', '' '', '''') END'

    SET @SelectPart = 'SELECT ' + @SourceTableUniqueReference + ', ' + @mkNameKeySELECTString + ', ' +

    @mkNameKeySELECTString + ', ' + @mkName2SELECTString + ', ' + @mkName3SELECTString + ',' + @mkNormalisedName + ','

    + @mkOrgNameKeyString + ', ' + @mkNormalisedOrganisation +

    ', ' + @mkOrgName1SELECTString + ', ' + @mkOrgName2SELECTString + ', ' + @mkOrgName3SELECTString + ', ' + @mkPostInSELECTString + ', ' + @mkPostOutSELECTString +

    ', ' + @mkPhoneticStreetSELECTString + ', ' + @mkPremiseSELECTString + ', ' + @mkTownSELECTString

    SET @FromPart = 'FROM Snapshot_MeritDirect_Load.dbo.' + @SourceTable

    EXEC (@InsertIntoPart + ' ' + @SelectPart + ' ' + @FromPart + @CROSSAPPLY)

    SET @SQL = ''

    SET @SQL = 'UPDATE ' + @SourceTable + '_keys_' + ' SET mkPremise = '''' WHERE mkPremise = ''0'''

    EXEC (@SQL)

    SET @SQL = ''

    SET @SQL = 'UPDATE ' + @SourceTable + '_keys_' + ' SET mkPremise = '''' WHERE mkPremise IS NULL'

    EXEC (@SQL)

    END;

    ---------------------------------------------------------

    It takes a minimal capacity for rational thought to see that the corporate 'free press' is a structurally irrational and biased, and extremely violent, system of elite propaganda.
    David Edwards - Media lens[/url]

    Society has varying and conflicting interests; what is called objectivity is the disguise of one of these interests - that of neutrality. But neutrality is a fiction in an unneutral world. There are victims, there are executioners, and there are bystanders... and the 'objectivity' of the bystander calls for inaction while other heads fall.
    Howard Zinn