Можем ли мы вставить строку в таблицу со значениями по умолчанию в каждом столбце с помощью служб SSIS? - PullRequest
1 голос
/ 31 мая 2019

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

СЦЕНАРИЙ: Я разрабатываю пакетное решение с использованием служб SSIS. Который читает запрос в задаче потока данных. В результате запроса создается некоторая строка, и мне просто нужно вставить этот результат в таблицу назначения (в базе данных MS SQL Server).

ВЫЗОВ

Проблема, которую я вижу здесь, заключается в том, что даже если запрос SQL не производит никакой строки, таблица назначения должна быть заполнена строкой по умолчанию. Но с CTE, полученным в запросе ниже и в SSIS, это не так просто.

SQL-запрос подключен к SSIS OLE DB SOURCE EDITOR.

DECLARE @date DATE
SET @date = GETDATE();

with cte as
(
select
   T.mot_fleettypedescription AS 'FleetType'
   ,(CASE WHEN F.mot_averagefleetsize = 0 THEN COUNT(C.mot_nscweight) ELSE 0 END) AS 'Fleet_Range_0'
   ,(CASE WHEN F.mot_averagefleetsize = 1 THEN COUNT(C.mot_nscweight) ELSE 0 END) AS 'Fleet_Range_1'
   ,(CASE WHEN F.mot_averagefleetsize BETWEEN 2 AND 4 THEN COUNT(C.mot_nscweight) ELSE 0 END) AS 'Fleet_Range_2-4'
   ,(CASE WHEN F.mot_averagefleetsize BETWEEN 5 AND 10 THEN COUNT(C.mot_nscweight) ELSE 0 END) AS 'Fleet_Range_5-10'
   ,CONVERT(DATE, C.mot_monthenddate) AS 'MED'
from Filteredmot_carrierfleettypes F
left outer join Filteredmot_carrierfleettype T on F.mot_fleettype = T.mot_carrierfleettypeid
left outer join Filteredmot_fleetcount C on F.mot_carriernumber = C.mot_carriernumber
where F.statecode = 0 AND C.mot_monthenddate = CONVERT(DATE, DATEADD(D,-(DAY(@date)), @date))
group by F.mot_averagefleetsize, T.mot_fleettypedescription, C.mot_monthenddate
)

select 
    CONVERT(NVARCHAR(50), 'by Weight') AS 'Caption', cte.MED AS 'Date', CONVERT(NVARCHAR(10), cte.FleetType) AS 'FleetType',
    CONVERT(NVARCHAR(25), 'ALL') AS 'OperatingStatus',
    SUM(cte.Fleet_Range_0) As 'Fleet_Range_0', SUM(cte.Fleet_Range_1) As 'Fleet_Range_1', SUM(cte.[Fleet_Range_2-4]) 'Fleet_Range_2-4', 
    SUM(cte.[Fleet_Range_5-10]) 'Fleet_Range_5-10', 
    (SUM(cte.Fleet_Range_0) + SUM(cte.Fleet_Range_1) + SUM(cte.[Fleet_Range_2-4]) + SUM(cte.[Fleet_Range_5-10])) 'TOTAL'
from cte
where cte.FleetType = 'Bus'
group by cte.FleetType, cte.MED

RESEARCH Если бы это была чисто серверная среда SQL, я бы проверил количество возвращаемых строк, используя COUNT(*) или @@ROWCOUNT с указанным ниже сегментом запроса. Но я не уверен, как смешать эту часть с вышеупомянутым фактическим запросом в SSIS.

DECLARE @CntOfRow INT;
select @CntOfRow = @@ROWCOUNT
--select @CntOfRow as 'Numrow'
if(@CntOfRow = 0)
begin
    if object_id ('tempdb..#Bus') is not null
    begin
        drop table #Bus
    end
    if object_id ('tempdb..#Bus') is null
    begin
        create table #Bus(
            Caption varchar(20), [Date] date, FleetType varchar(10), OperatingStatus varchar(25),
            Fleet_Range_0 int null, Fleet_Range_1 int null, [Fleet_Range_2-4] int null, [Fleet_Range_5-10] int null, TOTAL int null
        )
        insert into #Bus(Caption,[Date],FleetType,OperatingStatus, Fleet_Range_0,Fleet_Range_1,[Fleet_Range_2-4],[Fleet_Range_5-10],TOTAL)
        values('by Weight', CONVERT(DATE, DATEADD(D,-(DAY(@date)), @date)), 'Bus', 'ALL',0,0,0,0,0)
    end
    select * from #Bus
end

РАССЛЕДОВАНИЕ

Я рассмотрел такие компоненты SSIS, как Row Count и Conditional Split, чтобы сначала получить количество строк, следующих за исходным запросом, а затем применить условное разбиение для дальнейшей вставки полученного результата в таблицу назначения. Но после условного разбиения я не уверен, как сгенерировать временную таблицу и вставить строку со значениями по умолчанию для дальнейшей ее вставки в таблицу назначения.

Я также изучаю Execute SQL Task в потоке управления, чтобы увидеть, могу ли я сместить логику для генерации строки по умолчанию и передать эту строку в DFT для вставки в таблицу назначения.

Любое понимание этого сценария очень ценится.

ПОИСК РАЗРЕШЕНИЯ

package with execute sql task

1 Ответ

1 голос
/ 31 мая 2019

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

DECLARE @date DATE
SET @date = GETDATE();

with cte as
(
select
   T.mot_fleettypedescription AS 'FleetType'
   ,(CASE WHEN F.mot_averagefleetsize = 0 THEN COUNT(C.mot_nscweight) ELSE 0 END) AS 'Fleet_Range_0'
   ,(CASE WHEN F.mot_averagefleetsize = 1 THEN COUNT(C.mot_nscweight) ELSE 0 END) AS 'Fleet_Range_1'
   ,(CASE WHEN F.mot_averagefleetsize BETWEEN 2 AND 4 THEN COUNT(C.mot_nscweight) ELSE 0 END) AS 'Fleet_Range_2-4'
   ,(CASE WHEN F.mot_averagefleetsize BETWEEN 5 AND 10 THEN COUNT(C.mot_nscweight) ELSE 0 END) AS 'Fleet_Range_5-10'
   ,CONVERT(DATE, C.mot_monthenddate) AS 'MED'
from Filteredmot_carrierfleettypes F
left outer join Filteredmot_carrierfleettype T on F.mot_fleettype = T.mot_carrierfleettypeid
left outer join Filteredmot_fleetcount C on F.mot_carriernumber = C.mot_carriernumber
where F.statecode = 0 AND C.mot_monthenddate = CONVERT(DATE, DATEADD(D,-(DAY(@date)), @date))
group by F.mot_averagefleetsize, T.mot_fleettypedescription, C.mot_monthenddate
)
insert into #Bus(Caption,[Date],FleetType,OperatingStatus, Fleet_Range_0,Fleet_Range_1,[Fleet_Range_2-4],[Fleet_Range_5-10],TOTAL)
select 
    CONVERT(NVARCHAR(50), 'by Weight') AS 'Caption', cte.MED AS 'Date', CONVERT(NVARCHAR(10), cte.FleetType) AS 'FleetType',
    CONVERT(NVARCHAR(25), 'ALL') AS 'OperatingStatus',
    SUM(cte.Fleet_Range_0) As 'Fleet_Range_0', SUM(cte.Fleet_Range_1) As 'Fleet_Range_1', SUM(cte.[Fleet_Range_2-4]) 'Fleet_Range_2-4', 
    SUM(cte.[Fleet_Range_5-10]) 'Fleet_Range_5-10', 
    (SUM(cte.Fleet_Range_0) + SUM(cte.Fleet_Range_1) + SUM(cte.[Fleet_Range_2-4]) + SUM(cte.[Fleet_Range_5-10])) 'TOTAL'
from cte
where cte.FleetType = 'Bus'
group by cte.FleetType, cte.MED

DECLARE @Count INT
SELECT @Count = Count(*) FROM #Bus

If @Count = 0 
insert into #Bus(Caption,[Date],FleetType,OperatingStatus, Fleet_Range_0,Fleet_Range_1,[Fleet_Range_2-4],[Fleet_Range_5-10],TOTAL)
values('by Weight', CONVERT(DATE, DATEADD(D,-(DAY(@date)), @date)), 'Bus', 'ALL',0,0,0,0,0)

SELECT * FROM #Bus

Если это не работает, попробуйте реализовать это в хранимой процедуре

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...