2016-08-20 51 views
0

我的作業查詢在SSIS動態透視了多列

SELECT 
    CONVERT(varchar(12), GETDATE(), 110) AS Date 
, j.name AS job_name 
, CONVERT(varchar(10), ja.run_requested_date, 108) AS Start_Time 
, CONVERT(varchar(10), CONVERT(datetime, RTRIM(19000101)) 
     + (jh.run_duration * 9 + jh.run_duration % 10000 * 6 
     + jh.run_duration % 100 * 10)/216e4, 108) AS run_duration 
, (ja.run_requested_date + (CONVERT(varchar(10), CONVERT(datetime, RTRIM(19000101)) 
    + (jh.run_duration * 9 
    + jh.run_duration 
    % 10000 * 6 
    + jh.run_duration % 100 
    * 10)/216e4, 108))) AS Completion_Time 
FROM 
    (msdb.dbo.sysjobactivity ja 
     LEFT JOIN msdb.dbo.sysjobhistory jh 
     ON ja.job_history_id = jh.instance_id 
    ) 
    JOIN msdb.dbo.sysjobs_view j 
    ON ja.job_id = j.job_id 
WHERE 
    ja.session_id = (
         SELECT 
          MAX(session_id) 
         FROM 
          msdb.dbo.sysjobactivity 
        ) 
    AND j.name IN ('a', 'b', 'c', 'd', 'e'); 

運行我想這個查詢來獲取擺動作爲附加的圖像。 此外,日期欄需要從月初至日期。

enter image description here

+0

的可能的複製(http://stackoverflow.com/questions/10404348/sql-server-dynamic-pivot-query) – Matt

+0

在這個網站上有很多關於動態數據透視的例子,我只是給你們標記了其中的一個。但要在SSIS中執行此操作,您必須詢問您想要在桌上做什麼?如果你使用這種技術,那麼數據流就不存在問題,因爲SSIS不能很好地處理動態列。但是您仍可以使用腳本任務或腳本組件.... – Matt

回答

0

這可能有助於

CREATE VIEW vwJobs 
AS 
    SELECT CONVERT(VARCHAR(12), GETDATE(), 110) AS Date , 
      j.name AS job_name , 
      CONVERT(VARCHAR(10), ja.run_requested_date, 108) AS Start_Time , 
      CONVERT(VARCHAR(10), CONVERT(DATETIME, RTRIM(19000101)) 
      + (jh.run_duration * 9 + jh.run_duration % 10000 * 6 
       + jh.run_duration % 100 * 10)/216e4, 108) AS run_duration , 
      (ja.run_requested_date 
       + (CONVERT(VARCHAR(10), CONVERT(DATETIME, RTRIM(19000101)) 
        + (jh.run_duration * 9 + jh.run_duration % 10000 * 6 
         + jh.run_duration % 100 * 10)/216e4, 108))) AS Completion_Time 
    FROM (msdb.dbo.sysjobactivity ja 
       LEFT JOIN msdb.dbo.sysjobhistory jh ON ja.job_history_id = jh.instance_id 
      ) 
      JOIN msdb.dbo.sysjobs_view j ON ja.job_id = j.job_id 
    WHERE ja.session_id = (SELECT MAX(session_id) 
           FROM  msdb.dbo.sysjobactivity 
          ) 
      AND j.name IN ('a', 'b', 'c', 'd', 'e'); 

GO 

--QUERY 
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX); 
DECLARE @ColumnNamesInPivot AS NVARCHAR(MAX); 

--Get distinct values of PIVOT Column 
SELECT TOP 100 PERCENT 
     @ColumnNamesInPivot = ISNULL(@ColumnNamesInPivot + ',', '') 
     + QUOTENAME([Date]) 
FROM (SELECT DISTINCT 
        [Date] 
      FROM  vwJobs 
     ) AS P 
ORDER BY [Date]; 

--Prepare the PIVOT query using the dynamic query 
SELECT @DynamicPivotQuery = N'Select job_name, ''Start_Time'' Time,' 
     + @ColumnNamesInPivot + ' 
      FROM (SELECT * 
      FROM  vwJobs 
     ) AS SourceTable PIVOT(MAX(Start_Time) FOR [Date] IN (' 
     + @ColumnNamesInPivot + ')) AS PVTTable 
    UNION ALL 
    Select job_name, ''Duration'' Time,' + @ColumnNamesInPivot + ' 
      FROM (SELECT * 
      FROM  vwJobs 
     ) AS SourceTable PIVOT(MAX(run_duration) FOR [Date] IN (' 
     + @ColumnNamesInPivot + ')) AS PVTTable 
    UNION ALL 
    Select job_name, ''End_Time'' Time,' + @ColumnNamesInPivot + ' 
      FROM (SELECT * 
      FROM  vwJobs 
     ) AS SourceTable PIVOT(MAX(Completion_Time) FOR [Date] IN (' 
     + @ColumnNamesInPivot + ')) AS PVTTable  
     Order by job_name 
     '; 

--SELECT @DynamicPivotQuery; 
EXEC sp_executesql @DynamicPivotQuery; 
+0

jarred-當我打印@DynamicPivotQuery時無法看到結果。 – rahul

+0

@ jarred - 我需要將旋轉結果存儲到一個對象中,我將使用腳本task.please指南爲電子郵件正文顯示相同的結果。 – rahul

+0

您可以使用Select @DynamicPivotQuery查看結果查詢 – Yared

0

它可能會是很多更加簡單,如果你有個月(含一年)的一列,然後31天列。你不需要任何動態的。如果你有一個動態的列名,你甚至可以用SSIS做些什麼?

0

更新: - 在視圖中選擇GetDate()作爲日期列。 - 更新了PIVOT查詢,以便不返回多行。

所以,這裏是更新查詢:

CREATE VIEW vwJobs 
AS 
    SELECT CONVERT(VARCHAR(12), run_requested_date, 110) AS Date , 
      j.name AS job_name , 
      CONVERT(VARCHAR(10), ja.run_requested_date, 108) AS Start_Time , 

      CONVERT(VARCHAR(10), CONVERT(DATETIME, RTRIM(19000101)) 
      + (jh.run_duration * 9 + jh.run_duration % 10000 * 6 
       + jh.run_duration % 100 * 10)/216e4, 108) AS run_duration , 

      (ja.run_requested_date 
       + (CONVERT(VARCHAR(10), CONVERT(DATETIME, RTRIM(19000101)) 
        + (jh.run_duration * 9 + jh.run_duration % 10000 * 6 
         + jh.run_duration % 100 * 10)/216e4, 108))) AS Completion_Time 
    FROM (msdb.dbo.sysjobactivity ja 
       LEFT JOIN msdb.dbo.sysjobhistory jh ON ja.job_history_id = jh.instance_id 
      ) 
      JOIN msdb.dbo.sysjobs_view j ON ja.job_id = j.job_id 
      JOIN (SELECT CONVERT(DATE, run_requested_date) date , 
         MAX(session_id) session_id 
       FROM  msdb.dbo.sysjobactivity 
       WHERE run_requested_date IS NOT NULL 
       GROUP BY CONVERT(DATE, run_requested_date) 
      ) ss ON ja.session_id = ss.session_id 

      AND j.name IN ('a', 'b', 'c', 'd', 'e'); 

GO 


--QUERY 
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX); 
DECLARE @ColumnNamesInPivot AS NVARCHAR(MAX); 

--Get distinct values of PIVOT Column 
SELECT TOP 100 PERCENT 
     @ColumnNamesInPivot = ISNULL(@ColumnNamesInPivot + ',', '') 
     + QUOTENAME([Date]) 
FROM (SELECT DISTINCT 
        [Date] 
      FROM  vwJobs 
     ) AS P 
ORDER BY [Date]; 

--Prepare the PIVOT query using the dynamic query 
SELECT @DynamicPivotQuery = N'Select job_name, ''Start_Time'' Time,' 
     + @ColumnNamesInPivot + ' 
      FROM (SELECT Date, job_name, Start_Time 
      FROM  vwJobs 
     ) AS SourceTable PIVOT(MAX(Start_Time) FOR [Date] IN (' 
     + @ColumnNamesInPivot + ')) AS PVTTable 
    UNION ALL 
    Select job_name, ''Duration'' Time,' + @ColumnNamesInPivot + ' 
      FROM (SELECT Date, job_name, run_duration 
      FROM  vwJobs 
     ) AS SourceTable PIVOT(MAX(run_duration) FOR [Date] IN (' 
     + @ColumnNamesInPivot + ')) AS PVTTable 
    UNION ALL 
    Select job_name, ''End_Time'' Time,' + @ColumnNamesInPivot + ' 
      FROM (SELECT Date, job_name, Completion_Time 
      FROM  vwJobs 
     ) AS SourceTable PIVOT(MAX(Completion_Time) FOR [Date] IN (' 
     + @ColumnNamesInPivot + ')) AS PVTTable  
     Order by job_name 
     '; 

--PRINT @DynamicPivotQuery; 
EXEC sp_executesql @DynamicPivotQuery; 

導致我的地方:?SQL Server的動態PIVOT查詢] enter image description here