Ошибка инкрементальной загрузки данных служб SSIS - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь выполнить инкрементную вставку из промежуточной таблицы (cust_reg_dim_stg) в таблицу хранилища (dim_cust_reg).Это запрос, который я использую.

 insert into dim_cust_reg WITH(TABLOCK)
(
    channel_id
    ,cust_reg_id
    ,cust_id
    ,status
    ,date_created
    ,date_activated
    ,date_archived
    ,custodian_id
    ,reg_type_id
    ,reg_flags
    ,acc_name
    ,acc_number
    ,sr_id
    ,sr_type
    ,as_of_date
    ,ins_timestamp
    )
select channel_id
    ,cust_reg_id
    ,cust_id
    ,status
    ,date_created
    ,date_activated
    ,date_archived
    ,reg_type_id
    ,reg_flags
    ,acc_name
    ,acc_number
    ,sr_id
    ,sr_type
    ,as_of_date
    ,getdate() ins_timestamp

from umpdwstg..cust_reg_dim_stg stg with(nolock)
join lookup_channel ch with(nolock) on stg.channel_name = ch.channel_name

where not exists
(select * from dim_cust_reg dest
    where dest.cust_reg_id=stg.cust_reg_id 
    and dest.sr_id=stg.sr_id
    and dest.channel_id=ch.channel_id )

Здесь channel_id отсутствует в промежуточной таблице и берется с использованием таблицы поиска каналов (lookup_channel).При выполнении этого запроса я получаю следующую ошибку.

 Violation of PRIMARY KEY constraint 'PK__dim_cust__4A293521A789A5FA'. 
 Cannot insert duplicate key in object 'dbo.dim_cust_reg'.

Что не так с запросом?channel_id, sr_id и cust_reg_id формируют уникальную комбинацию клавиш.Кажется, что нет ошибки данных.

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Есть 2 области, в которых вам нужно будет устранить неполадки: -

В этом коде ниже:

join lookup_channel ch with(nolock) on stg.channel_name = ch.channel_name 

Входящее имя канала в промежуточной таблице может иметь другое имя канала по сравнению ск записи в измерении назначения.

ИЛИ это может быть из-за этого условия соединения внутри условия НЕ СУЩЕСТВУЕТ:

and dest.sr_id=stg.sr_id
    and dest.channel_id=ch.channel_id

Здесь снова входящий идентификатор канала может отличаться, когда вы сравниваете подготовленные данные с данными вместо назначения.Таким образом, предложение состоит в том, чтобы игнорировать идентификатор канала один раз и попытаться устранить неполадки.Как только эти данные загружены в цель, вы можете получить точную причину, по которой произошла ошибка из-за идентификатора канала.

Счастливого устранения неполадок!

0 голосов
/ 24 мая 2018

Если в таблице уже есть повторяющиеся записи - custr_regr_dim_stg - тогда запрос SELECT выдаст обе эти записи и попытается вставить их в таблицу dim_cust_reg.Поэтому используйте DISTINCT в операторе SELECT.

...