• SSIS添加分区-动态


    主要参考:动态分区

    一、前提准备:

    1、一个日期存储过程,注意代码可以得到一个月中的最后一天,最终生成时间维度。

    USE [DrugDW]
    GO
    /****** Object:  StoredProcedure [dbo].[PROC_DATETIME]    Script Date: 2/28 星期二 14:16:46 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
       
      
    ALTER PROCEDURE [dbo].[PROC_DATETIME]
        
    AS
    BEGIN
        
        
    
    
    /****** Object:  StoredProcedure [dbo].[proc_Dim_date]    Script Date: 05/20/2016 11:35:58 ******/
    
    
    IF OBJECT_ID('dbo.Dim_Date') IS NOT NULL
     DROP TABLE dbo.[Dim_Date]
      
      
    CREATE TABLE [dbo].[Dim_Date](
     [DateKey] [int] NULL,
     [Date] [datetime] NULL,
     [Year] [float] NULL,
     [Month] [float] NULL,
     [Month EN] [nvarchar](50) NULL,
     [Month Short EN] [nvarchar](50) NULL,
     [Month CN] [nvarchar](50) NULL,
     [Day] [float] NULL,
     [Quarter] [float] NULL,
     [Quarter EN] [nvarchar](50) NULL,
     [Quarter CN] [nvarchar](50) NULL,
     [Weekday] [float] NULL,
     [Weekday CN] [nvarchar](50) NULL,
     [Weekday Short EN] [nvarchar](50) NULL,
     [Week of Year] [float] NULL,
     [Day of Year] [float] NULL,
     [SemiYearly] [nvarchar](50) NULL,
     [Period of Ten Days] [nvarchar](10) NULL,
     [Period of Index] [nvarchar](2) NULL,
     [Weekend] [nvarchar](5) NULL
    ) ON [PRIMARY]
    
    SET DATEFIRST 7 --设周日为每周的第一天
    
    --向日期表插入数据
    DECLARE @b1 DATETIME
    set @b1='2015-01-01'     --设置起始日期 
     
    WHILE @b1< dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))   --设置截止日期
    BEGIN
     INSERT INTO dbo.[Dim_Date] (
      [DateKey],
      [Date], 
      [Year],
      [Month],
      [Month EN],
      [Month Short EN],
      [Month CN],
      [Day],
      [Quarter],
      [Quarter EN],
      [Quarter CN],
      [Weekday],
      [Weekday CN],
      [Weekday Short EN],
      [Week of Year],
      [Day of Year],
      [SemiYearly],
      [Period of Ten Days],
      [Period of Index] ,
      [Weekend]
     ) 
     VALUES( 
       CONVERT(NVARCHAR(10),@b1,112),  --DateKey 1
       @b1, --Date 2
       DATEPART(year, @b1), --Year 3
       DATEPART(month, @b1), --Month 4
       CASE --Month EN 5
         when (DATEPART(month, @b1))='1' then 'January' 
         when (DATEPART(month, @b1))='2' then 'February'
         when (DATEPART(month, @b1))='3' then 'March'
         when (DATEPART(month, @b1))='4' then 'April'
         when (DATEPART(month, @b1))='5' then 'May'
         when (DATEPART(month, @b1))='6' then 'June'
         when (DATEPART(month, @b1))='7' then 'July'
         when (DATEPART(month, @b1))='8' then 'August'
         when (DATEPART(month, @b1))='9' then 'September'
         when (DATEPART(month, @b1))='10' then 'October'
         when (DATEPART(month, @b1))='11' then 'November'
         else 'December'
       END, 
       CASE --Month Short En 6
        when (DATEPART(month, @b1))='1' then 'Jan' 
        when (DATEPART(month, @b1))='2' then 'Feb'
        when (DATEPART(month, @b1))='3' then 'Mar'
        when (DATEPART(month, @b1))='4' then 'Apr'
        when (DATEPART(month, @b1))='5' then 'May'
        when (DATEPART(month, @b1))='6' then 'Jun'
        when (DATEPART(month, @b1))='7' then 'Jul'
        when (DATEPART(month, @b1))='8' then 'Aug'
        when (DATEPART(month, @b1))='9' then 'Sep'
        when (DATEPART(month, @b1))='10' then 'Oct'
        when (DATEPART(month, @b1))='11' then  'Nov'
        else 'Dec'
       END,
          CASE --Month CN 7
           when (DATEPART(month, @b1))='1' then N'一月' 
        when (DATEPART(month, @b1))='2' then N'二月'
        when (DATEPART(month, @b1))='3' then N'三月'
        when (DATEPART(month, @b1))='4' then N'四月'
        when (DATEPART(month, @b1))='5' then N'五月'
        when (DATEPART(month, @b1))='6' then N'六月'
        when (DATEPART(month, @b1))='7' then N'七月'
        when (DATEPART(month, @b1))='8' then N'八月'
        when (DATEPART(month, @b1))='9' then N'九月'
        when (DATEPART(month, @b1))='10' then N'十月'
        when (DATEPART(month, @b1))='11' then  N'十一月'
        else N'十二月'
       END,
       DATEPART(day, @b1),--day  8
       DATEName (qq, @b1),--quarter 9
       CASE   --quarter en  10
        when DATEName (qq, @b1)='1' then 'Q1'
        when DATEName (qq, @b1)='2' then 'Q2' 
        when DATEName (qq, @b1)='3' then 'Q3'
        else  'Q4'
       END,
             CASE  --quarter cn  11
        when DATEName (qq, @b1)='1' then N'一季度'
        when DATEName (qq, @b1)='2' then N'二季度' 
        when DATEName (qq, @b1)='3' then N'三季度'
        else  N'四季度'
       END,    
       DATEPART(dw, @b1),--Weekday 12
       CASE --Weekday CN  13
        when DATEPART(dw, @b1)=1 then  N'星期日'
        when DATEPART(dw, @b1)=2 then  N'星期一'
        when DATEPART(dw, @b1)=3 then  N'星期二'
        when DATEPART(dw, @b1)=4 then  N'星期三'
        when DATEPART(dw, @b1)=5 then  N'星期四'
        when DATEPART(dw, @b1)=6 then  N'星期五'  
        else N'星期六'
       END,
       CASE --Weekday Short EN 14  --注意,周日是第一天.
        when DATEPART(dw, @b1)='1' then 'Sun'
        when DATEPART(dw, @b1)='2' then 'Mon'
        when DATEPART(dw, @b1)='3' then 'Tue'
        when DATEPART(dw, @b1)='4' then 'Wed'
        when DATEPART(dw, @b1)='5' then 'Thu'
        when DATEPART(dw, @b1)='6' then 'Fri'
        else 'Sat'
       END, 
       DATEName (wk, @b1),--week of year 15
       DATEName (dy, @b1),--day of year  16
       CASE --SemiYearly 17
        when DATEPART(month, @b1)<=6 then N'上半年'
        else N'下半年'
       END,
          CASE  --Period of Ten Days 18
        when DATEName (dd, @b1)<=10 then N'上旬' 
        when DATEName (dd, @b1)>20  then N'下旬'
        else N'中旬'
       END,
          CASE  --Period of Ten Days 19
        when DATEName (dd, @b1)<=10 then N'1' 
        when DATEName (dd, @b1)>20  then N'3'
        else N'2'
       END,
       CASE --Is it Weekend? 20
        when DATEPART(dw, @b1)='1' then '周末'
        when DATEPART(dw, @b1)='7' then '周末'
        else '平时'
       END 
    )
    --日期加1天
     set @b1=DATEADD(day, 1, @b1)
    END
    end
       
       
       
    View Code

    2、一个事实表:

     3、构建好的Cube,并且无分区(有分区也无妨,这里只是排除干扰,容易理解):

    4、准备SSIS参数:

      二、利用SSIS动态构建分区

    最终效果

     最终效果

       2.1 、执行SQL任务        

     

    SQLStatement代码:

    SELECT 'DrugDW'                                                    AS DataSoureID,--数据源
    
           'Drug DW'                                                       AS CubeName,--分区来自哪一个cube
    
           'Drug DW'                                                       AS CubeID,
    
           'Fact OP Fee Detail'                                           AS MeasureGroup,--指定是一个度量值组
    
           'Fact OP Fee Detail'                                      AS MeasureGroupID,
    
           'Fact OP Fee Detail ' + Cast(MonthInfo.YearMonth AS VARCHAR(6)) AS Partition,--分区名称=度量值组名称+年月
    
           'SELECT *  FROM [dbo].[Fact_OPFeeDetail]    where_clause'   AS SQL,--要进行分区的SQL
    
           cast(MinDateKey as varchar(8)) as MinDateKey,--最小datekey
    
           cast(MaxDateKey as varchar(8)) as MaxDateKey--最大datekey
    
    FROM   (
     
     SELECT t1.YearMonth,
    
           (SELECT Min(datekey)   FROM   dim_date t2 WHERE  CONVERT(VARCHAR(6), t2.Date, 112) = t1.YearMonth) AS MinDateKey,
    
           (SELECT Max(datekey) FROM   dim_date t2 WHERE  CONVERT(VARCHAR(6), t2.Date, 112) = t1.YearMonth) AS MaxDateKey
    
     FROM  
    
          (SELECT DISTINCT CONVERT(VARCHAR(6), Date, 112) AS YearMonth   FROM   dim_date) AS t1
          
          )MonthInfo
    
    WHERE  EXISTS(SELECT *   FROM   [dbo].[Fact_OPFeeDetail]   WHERE [VisitDateID] BETWEEN MonthInfo.MinDateKey AND MonthInfo.MaxDateKey)
    View Code

    SQLStatement执行结果:

    设置结果集:

    2.2、Foreach 循环容器便利结果集    

     

     2.3、编写脚本任务,处理每次的遍历结果:        

    2.4、 点击“编辑脚本”:  引用:Analysis Management Obejcts包  

     脚本代码(在SQL SERVER 2008请使用语句:(String)Dts.Variables["Partition"].Value;进行强制,不要使用Dts.Variables["User::Partition"].Value.ToString(); ):  

    #region Help:  Introduction to the script task
    /* The Script Task allows you to perform virtually any operation that can be accomplished in
     * a .Net application within the context of an Integration Services control flow. 
     * 
     * Expand the other regions which have "Help" prefixes for examples of specific ways to use
     * Integration Services features within this script task. */
    #endregion
    
    
    #region Namespaces
    using System;
    using System.Data;
    using Microsoft.SqlServer.Dts.Runtime;
    using System.Windows.Forms;
    using Microsoft.AnalysisServices;
    #endregion
    
    namespace ST_4038a8110570463994b546d9f7d48b3d
    {
        
        [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
        public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
        {
    
            #region ScriptResults declaration
            /// <summary>
            /// This enum provides a convenient shorthand within the scope of this class for setting the
            /// result of the script.
            /// 
            /// This code was generated automatically.
            /// </summary>
            enum ScriptResults
            {
                Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
                Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
            };
            #endregion
    
    
            public void Main()
            {
               
                // TODO: Add your code here
                String sPartition = Dts.Variables["User::Partition"].Value.ToString();     
                
                String sCubeName = Dts.Variables["User::CubeName"].Value.ToString();
    
                String sMeasureGroup = Dts.Variables["User::MeasureGroup"].Value.ToString();          
                String sServer = "localhost";
                String sDataBaseID = Dts.Variables["User::DatabaseID"].Value.ToString();           
                String sCubeID = Dts.Variables["User::CubeID"].Value.ToString();         
                String sMeasureGroupID = Dts.Variables["User::MeasureGroupID"].Value.ToString();         
    
                String sDataSoureID = Dts.Variables["User::DataSoureID"].Value.ToString();
             
                String sSQL = Dts.Variables["User::SQL"].Value.ToString();
                String sMaxDateKey = Dts.Variables["User::MaxDateKey"].Value.ToString();        
    
                String sMinDateKey = Dts.Variables["User::MinDateKey"].Value.ToString();
    
                String aSql = sSQL.Replace("where_clause", "where VisitDateID  &gt;=" + sMinDateKey + " and VisitDateID &lt;=" + sMaxDateKey);
                    
                ConnectionManager cm = Dts.Connections.Add("MSOLAP100");
                cm.ConnectionString = "Provider=MSOLAP.4;Data Source=localhost;IntegratedSecurity=SSPI;Initial Catalog=" + sDataBaseID;
    
                
                Microsoft.AnalysisServices.Server aServer = new Server();            
                aServer.Connect(sServer);           
                Microsoft.AnalysisServices.Database aDatabase = aServer.Databases.FindByName(sDataBaseID);       
    
                CubeCollection cubeCollection = aDatabase.Cubes;
                foreach (Cube item in cubeCollection)
                {
                    string name = item.Name;
                }
    
                Microsoft.AnalysisServices.Cube aCube = aDatabase.Cubes.FindByName(sCubeName);
              
    
                Microsoft.AnalysisServices.MeasureGroup aMeasureGroup;
                try
                {
    
                    MeasureGroupCollection collection = aCube.MeasureGroups;
    
                    aMeasureGroup = collection.FindByName(sMeasureGroup);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                       
    
                if (aMeasureGroup.Partitions.Contains(sPartition))
                {
    
                    Dts.Variables["User::IsNotePresent"].Value = false;
                    Dts.Variables["User::Xmla_script"].Value = "";
                    Dts.TaskResult = (int)ScriptResults.Success;
    
                    
                }
                else
                {
    
                    Dts.Variables["User::IsNotePresent"].Value = true;
                    
                    Dts.Variables["User::Xmla_script"].Value =
    
                    
                        "<Create xmlns="http://schemas.microsoft.com/analysisservices/2003/engine">"
    
                        + "<ParentObject>"
    
                        + "<DatabaseID>" + sDataBaseID + "</DatabaseID>"
    
                        + "<CubeID>" + sCubeID + "</CubeID>"
    
                        + "<MeasureGroupID>" + sMeasureGroupID + "</MeasureGroupID>"
    
                        + "</ParentObject>"
    
                        + "<ObjectDefinition>"
    
                        + "<Partition xmlns:xsd="http://www.w3.org/2001/XMLSchema" "
    
                        + " xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ddl2="http://schemas.microsoft.com/analysisservices/2003/engine/2" xmlns:ddl2_2="http://schemas.microsoft.com/analysisservices/2003/engine/2/2" xmlns:ddl100_100="http://schemas.microsoft.com/analysisservices/2008/engine/100/100" xmlns:ddl200="http://schemas.microsoft.com/analysisservices/2010/engine/200" xmlns:ddl200_200="http://schemas.microsoft.com/analysisservices/2010/engine/200/200">"
    
                        + "<ID>" + sPartition + "</ID>"
    
                        + "<Name>" + sPartition + "</Name>"
    
                        + "<Source xsi:type="QueryBinding">"
    
                        + "<DataSourceID>" + sDataSoureID + "</DataSourceID>"
    
                        + "<QueryDefinition>" + aSql + "</QueryDefinition>"
    
                        + "</Source>"
    
                        + "<StorageMode>Molap</StorageMode><ProcessingMode>Regular</ProcessingMode>"
    
                        + "<ProactiveCaching><SilenceInterval>-PT1S</SilenceInterval><Latency>-PT1S</Latency><SilenceOverrideInterval>-PT1S</SilenceOverrideInterval><ForceRebuildInterval>-PT1S</ForceRebuildInterval>"
    
                        + "<Source xsi:type="ProactiveCachingInheritedBinding" /></ProactiveCaching>"
    
                        + "</Partition>"
    
                        + "</ObjectDefinition>"
    
                        + "</Create>";
    
    
                 
                      Dts.TaskResult = (int)ScriptResults.Success;
    
                }
    
    
    
                
            }
    
         
    
        }
    }
    View Code

     处理脚本返回值:如果@IsNotePresent是ture:就会将参数Xmla_script中的字符串传给下面的"Analysis Services 执行DDL任务"由它为度量值组生成分区;如果是false就返回null,不生成分区;

    2.5、添加Analysis Services 执行 DDL 任务,处理返回值(即为度量值组生成分区): 

    2.6、执行SSIS任务,查看分区生成情况:    

  • 相关阅读:
    2020春Contest
    HDU Count the string (KMP)
    P1757 通天之分组背包
    L1-050 倒数第N个字符串
    3月份目标
    Division UVa725
    数三角
    luogu P2051 [AHOI2009]中国象棋 dp 状态压缩+容斥
    Codeforces Round #654 (Div. 2) E
    Codeforces Round #654 (Div. 2) D
  • 原文地址:https://www.cnblogs.com/java-oracle/p/6478853.html
Copyright © 2020-2023  润新知