2016-11-23 8 views
2

Можем ли мы обсудить, как загрузить приведенный ниже результат запроса в таблицу назначения, используя ssis.I знаю, что мы можем использовать это в T-sql, а также как исходный запрос OLEDB. Но все еще интересно как реализовать его, используя только компоненты потока данныхКак реализовать нижеследующий запрос с помощью ssis

SELECT 
    CLIENTID  = CAST(PER.CLIENTID AS INT) 
    ,CASEID   = CAST(CS.CASEID AS INT) 
    ,CAST(RIGHT(ev.oid, 10) as int) AS EventID 
    ,ev.ServiceSubtypeCode 
    ,ev.ServiceSubtypeCode +' - '+ev.ServiceSubTypeDesc as ServiceSubTypeDesc 
    ,WU.ProviderID as WorkunitProviderID 
    ,WU.ProviderName as WorkUnitProviderName 
    ,ev.eventstartdate as AssessmentStartDate 
    ,CONVERT(CHAR(5),ASM.getstarttimestamp,8) as AssessmentStartTime 
    ,ev.EVENTENDDATE as AssessmentEndDate 
    ,ev.EVENTENDTIME as AssessmentEndTime 
    ,CAST(asm.getAssmtTemplateName as nvarchar(200)) as AssessmentTypeDesc 
    ,j.providerid 
    ,j.ProviderName 
    ,j.ProviderRole 
    ,EV.ISCOMPLETED 
    , EV.ISFINALISED 
    ,EV.ISREVOKED 
    , EV.REVOKEDDATE AS REVOKEDDATE 
    ,ASM.OID AS ASSESSMENTID 

FROM DBO.ASSESSMENT ASM 
LEFT OUTER JOIN DBO.INDIVIDUALPERSON PER  ON ASM.MYPERSON = PER.OID 
LEFT OUTER JOIN DBO.[CASE] CS  ON ASM.MYCASE = CS.OID 
LEFT OUTER JOIN (
         SELECT CAST(ST.CODE AS VARCHAR(8))AS SERVICETYPECODE 
           , CAST(ST.DESCRIPTION AS VARCHAR(100)) AS SERVICETYPEDESC 
           , CAST(SST.CODE AS VARCHAR(8)) AS SERVICESUBTYPECODE 
           , CAST(SST.DESCRIPTION AS VARCHAR(100)) AS SERVICESUBTYPEDESC 
           , DATEADD(DD,0, DATEDIFF(DD,0,EV.GETRPSSTARTTIMESTAMP)) AS EVENTSTARTDATE 
           , CONVERT(CHAR(5),EV.GETRPSSTARTTIMESTAMP,8) AS EVENTSTARTTIME 
           , DATEADD(DD,0, DATEDIFF(DD,0,EV.GETRPSENDTIMESTAMP)) AS EVENTENDDATE 
           , CONVERT(CHAR(5),EV.GETRPSENDTIMESTAMP,8) AS EVENTENDTIME 
           ,CAST(VEN.DESCRIPTION AS VARCHAR(12)) AS EVENTVENUE 
           ,EV.ISCOMPLETED 
           , EV.ISFINALISED 
           ,EV.ISREVOKED 
           , DATEADD(DD,0, DATEDIFF(DD,0,EV.REVOKEDON)) AS REVOKEDDATE 
           , EV.OID 
             from Event ev 
             LEFT OUTER JOIN  ServiceType AS st ON ev.myServiceType = st.oid 
             LEFT OUTER JOIN ServiceSubtype AS sst ON ev.myServiceSubtype = sst.oid 
             LEFT OUTER JOIN AllCodes AS ven ON ev.myEventVenueCode = ven.oid 
            )as EV 
ON ASM.MYEVENT = EV.OID 
LEFT OUTER JOIN  (
             select wu.oid 
             ,CAST(wu.providerid AS VARCHAR(100)) AS providerid 
             ,CAST(nm.getfullname AS VARCHAR(100)) AS ProviderName 
             ,wu.contactname 
             ,wu.activatedate as StartDate 
             ,wu.deactivatedate as EndDate 
             ,case when wu.deactivatedate is null then 1 else 0 end as IsActiveToday 
             from workunitprovider wu 
             LEFT OUTER JOIN dbo.allprovidernames nm ON wu.oid = nm.myprovider 
             where nm.myNameType in (02245.0000000252) 
            ) as WU 
ON ASM.MYWORKUNITPROVIDER = WU.OID 
Left join (     
           select f.myEvent 
           ,f.myProvider 
           ,f.myproviderrolecode 
           ,f.Max_ProvOid 
           ,CAST(g.providerid AS VARCHAR(100)) AS providerid 
           ,CAST(i.description AS VARCHAR(150)) AS ProviderRole 
           ,cast (h.getFullName as nvarchar (150)) as ProviderName 
            from(   select d.myEvent 
                 ,myProvider 
                 ,myproviderrolecode 
                 ,d.Max_ProvOid 
                 from (    select A.myEvent, max(b.oid) as Max_ProvOid 
                        from alleventitems a 
                        left outer join ProviderEventItemRole as b on a.oid = b.myeventitem 
                        group by A.myEvent 
                     ) as d 
                     left join 
                     (       select A.myEvent,b.myProvider,b.myproviderrolecode,a.oid as a_oid,b.oid as b_oid 
                            from alleventitems a 
                            left outer join ProviderEventItemRole as b on a.oid = b.myeventitem 
                     )as e on d.myevent = e.myevent and max_provOid = b_oid 
           ) as f 
           left join dbo.allproviders as g on f.myProvider = g.oid 
           left join (
                select * 
                from dbo.AllProviderNames 
                where mynametype ='02245.0000000252' 
               )as h on f.myprovider =h.myprovider 
           left join dbo.allcodes as i on f.myproviderrolecode = i.oid 
    )as j on ASM.myevent = j.myevent; 

ответ

2

Прежде чем мы начнем, отказ от ответственности:

Сложные запросы SELECT, лучше всего выражены в T-SQL. SSIS лучше всего использовать для задач ETL.

Теперь ... с этим в сторону. Давайте посмотрим, что у нас есть. Этот запрос имеет пятнадцать LEFT JOINS, расположенных в трех уровнях: пять сверху, семь посередине и два внизу. Переполнены повсюду: CAST() s и GROUP BY s. Все эти команды SQL могут быть выполнены с помощью компонентов SSIS.

  • JOIN = Merge Join component.
  • GROUP BY = Совокупный компонент.
  • CAST = Производный компонент столбца.

Поскольку у вас есть такой большой запрос, я бы рекомендовал разбить его на более мелкие куски. Начиная с самого внутреннего соединения.

select 
     d.myEvent 
     ,myProvider 
     ,myproviderrolecode 
     ,d.Max_ProvOid 
    from (     
     select A.myEvent, max(b.oid) as Max_ProvOid 
     from alleventitems a 
     left outer join ProviderEventItemRole as b 
     on a.oid = b.myeventitem 
     group by A.myEvent 
    ) as d 
    left join (       
     select A.myEvent,b.myProvider,b.myproviderrolecode,a.oid as a_oid,b.oid as b_oid 
     from alleventitems a 
     left outer join ProviderEventItemRole as b 
     on a.oid = b.myeventitem 
    ) as e 

Перевод этого вопроса в SSIS будет выглядеть следующим образом.

enter image description here

Выше мы слияние четырех таблиц в одну. Вы можете узнать больше о том, как настроить объединение слияния here. Повторите вышеуказанный шаблон для остальных JOINS и соедините их все вместе, и вы переведете весь запрос в SSIS!


Теперь, когда мы можем видеть, как это может быть сделано, я хотел бы спросить, почему мы хотели бы сделать это в SSIS?

+1

... и если вы настаиваете на его выполнении, пожалуйста, о, пожалуйста, отправьте записи и сравнительные характеристики! –

+0

Спасибо за ответ. Если я смогу это сделать, используя ssis, тогда он будет быстрым !? – user1254579

+0

Нам не нужно агрегировать столбец перед объединением !? , в этой ситуации – user1254579

 Смежные вопросы

  • Нет связанных вопросов^_^