2012-02-29 3 views
0

Построил запрос, который в основном рассматривает таблицу, которая содержит все праздничные дни, а затем просматривает каждый месяц текущего финансового года, а затем рассказывает мне, сколько рабочих дней доступно для работы минус банковские звонки и выходные. Например, в этом месяце есть 21. Существует также кумулятивная подача, которая в основном складывается каждый месяц, поэтому кумулятивный за апрель-февр будет иметь все эти дни.Задача SSIS, включая SQL, которая создает временную таблицу

В запросе есть дескриптор CreateTable #DATA, который отбрасывается в конце, это отлично работает в Management Studio и работает правильно.

Моя проблема в том, что я выполняю задание SSIS и сохранил свой запрос в виде файла SQL и выбрал его с помощью кнопки «Обзор». Это не позволяет мне продолжать, поскольку я считаю, что у него есть проблема с временной таблицей (см. Снимок экрана)

Любые предложения о том, как я могу заставить это работать при сохранении функциональности?

Пожалуйста, смотрите код для справки:

DECLARE @StartDate DATETIME, 
     @EndDate DATETIME 



SELECT @StartDate = (select 
case when month(getdate()) >= 4 then 
convert(datetime, cast(year(getdate()) as varchar) + '-4-1') 
else 
convert(datetime, cast(year(getdate())-1 as varchar) + '-4-1') 
end), 



     @EndDate = (select 
case when month(getdate()) < 4 then 
convert(datetime, cast(year(getdate()) as varchar) + '-3-31') 
else 
convert(datetime, cast(year(getdate())+1 as varchar) + '-3-31') 
end) 

CREATE TABLE #data 
    ( 
    firstday DATETIME NOT NULL PRIMARY KEY, 
    workingdays INT NOT NULL 
); 

WITH dayscte ([Date]) 
    AS (SELECT @StartDate 
     UNION ALL 
     SELECT Dateadd(DAY, 1, [Date]) 
     FROM dayscte 
     WHERE [Date] <= @Enddate) 
INSERT INTO #data 
SELECT MIN([Date]), 
     COUNT(*) [Day] 


FROM table2 
     LEFT JOIN [dbo].[mydb].[mytable1] 
     ON [Date] BETWEEN [dbo].[mydb].[mytable1].startdate AND [dbo].[mydb].[mytable1].enddate 



where 
NOT EXISTS (
    SELECT field1,field2 FROM [dbo].[mydb].[mytable1].tscheme_cal WHERE 
    dayid ='0234572347854234' 
    AND 
    [date] <= startdate 
    AND 
    [date] >= enddate 
    ) 
     AND Datename(weekday, [Date]) NOT IN ('Saturday', 'Sunday') 
GROUP BY Datepart(MONTH, [Date]), 
      Datepart(YEAR, [Date]) 
OPTION (MAXRECURSION 366) 

DECLARE @Date DATETIME 

SET @Date = (SELECT MIN(firstday) 
      FROM #data) 

SELECT Period, 
     workingdays [Days_Available] , 

     year (firstday) AS [Year] 


FROM (SELECT Datename(MONTH, firstday) [Period], 
       workingdays, 
       0       [SortField], 
       firstday 
     FROM #data 
     UNION 
     SELECT Datename(MONTH, @Date) + ' - ' + Datename(MONTH, firstday), 
       (SELECT SUM(workingdays) 
       FROM #data b 
       WHERE b.firstday <= a.firstday) [WorkingDays], 
       1         [SortField], 
       firstday 
     FROM #data a 
     WHERE 


     firstday > @Date) data 





ORDER BY sortfield, 
      firstday 

DROP TABLE #data 

enter image description here

+0

Вы пробовали 'объявить @data таблицу? – ChrisBD

+0

Также проверьте мой ответ на этот похожий вопрос http://stackoverflow.com/questions/18346484/ssis-package-not-wanting-to-fetch-metadata-of-temporary-table/18360265#18360265 –

ответ

1

его не просто дело с временными таблицами на SSIS. я предлагаю эту статью:

http://www.sqllike.com/using-temporary-tables-with-ssis.html 

это решение, но я не люблю его. Я иногда использую переменные таблицы или создаю обычную таблицу в БД, а затем удаляю ее в конце.

1

В SSIS я обнаружил, что переменные таблицы работают хорошо. Вы не можете использовать временные таблицы даже в сохраненном proc, если это исходный код для преобразования.

+0

Вы можете так долго поскольку вы объявляете фиктивный результат перед вашим фактическим запросом. См. Также: http://stackoverflow.com/questions/18346484/ssis-package-not-wanting-to-fetch-metadata-of-temporary-table/18360265#18360265 –

0

В SQL Server 2012, если вы используете временные таблицы, вы должны указать набор результатов.

Это проблема с процедурой sp_describe_first_result_set, которую SSIS использует для возврата выходных метаданных.

E.g.

EXEC dbo.RptResults_StoredProcedure 

Становится

EXEC dbo.RptResults_StoredProcedure 
WITH RESULT SETS 
((
    Date NVARCHAR(10), 
    Location VARCHAR(12), 
    Department CHAR(1), 
    Shift CHAR(1), 
    ForecastSales DECIMAL(18,2), 
    ActualSales DECIMAL(18,2) 
)) 

Для получения дополнительной информации зрения

http://blog.concentra.co.uk/2014/08/22/column-metadata-determined-correctly-ssis-data-flow-task-stored-procedure-inputs/

http://blog.concentra.co.uk/2014/08/22/column-metadata-determined-correctly-ssis-data-flow-task-stored-procedure-inputs/

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