Я не уверен, что мой вопрос найдет решение, и после поиска я не смог найти обходной путь.
СЦЕНАРИЙ:
Я разрабатываю пакетное решение с использованием служб 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 для вставки в таблицу назначения.
Любое понимание этого сценария очень ценится.
ПОИСК РАЗРЕШЕНИЯ