SSIS工作包括创建临时表的SQL

时间:2012-02-29 11:40:20

标签: sql sql-server sql-server-2008 tsql ssis

构建了一个查询,它基本上查看包含所有银行假期的表格,然后查看当前财政年度的每个月,然后告诉我可以工作多少个工作日减去银行业务和周末。例如,这个月有21个。还有一个累积的文件,基本上每个月加起来,所以4月到2月的累计将会增加所有这些日子。

在查询中有一个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

3 个答案:

答案 0 :(得分:1)

在SSIS上处理临时表并不容易。 我建议这篇文章:

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

这是一个解决方案,但我不喜欢它。 我有时会使用表变量或在DB上创建常规表,然后将其放在最后。

答案 1 :(得分:1)

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

答案 2 :(得分: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/

相关问题