2012-02-29 68 views
0

已经构建了一个基本上查看包含所有银行假期的表并查看当前财政年度的每个月的查询,然后告诉我有多少工作日可用于工作减去银行休息室和周末。例如这个月有21个。还有一个累积的提交每月基本累计,所以4 - 2月的累积将会增加所有这些日子。包括创建临时表的SQL的SSIS作业

在查询中有一个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 2012-02-29 11:44:23

+0

还检查出我对这个类似问题的答案http://stackoverflow.com/questions/18346484/ssis-package-not-wanting-to-fetch-metadata-of-temporary-table/18360265#18360265 – 2014-12-03 21:28:05

回答

1

其不容易对付的SSIS临时表。 我建议这篇文章:

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

它是一个解决方案,但我不喜欢它。 我有时候会使用表变量或者在数据库上创建一个常规表,然后在最后删除它。

1

在SSIS中,我发现表变量运行良好。如果它是转换的源代码,则即使在存储过程中也不能使用临时表。

+0

你可以一样长因为您在实际查询之前声明了一个虚拟结果集。另请参阅:http://stackoverflow.com/questions/18346484/ssis-package-not-wanting-to-fetch-metadata-of-temporary-table/18360265#18360265 – 2014-12-03 21:28:54

0

在SQL Server 2012中,如果使用临时表,则必须指定一个结果集。

这是SSIS用来返回输出元数据的sp_describe_first_result_set过程的问题。

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/