SSIS动态删除分区

在前面两篇博客中,介绍了动态分区(按照月份)和动态执行分区(每天 执行),但是在实际项目中会有问题:我们分区的CUBE是每天要执行的,但是动态分区每天不会重新生成!

脚本任务中的这段代码,决定了存在的分区将不会执行,造成数据缺失。

//如果分区存在将返回false,不在生成分区,如果是3月1号执行的动态生成分区SSIS包,那么以后的3月数据都将加载不进来
 if (aMeasureGroup.Partitions.Contains(sPartition))
    {

                Dts.Variables["User::IsNotePresent"].Value = false;
                Dts.Variables["User::Xmla_script"].Value = "";
                Dts.TaskResult = (int)ScriptResults.Success;

    }

如何解决?

简单的做法是:我们可以在动态生成分区任务执行之前,对当前月份的分区动态的删除了,这样当前月份的分区就不存了,此时在执行生成分区代码,就会判断当前分区不存在而建立分区。参数的准备就按照上篇的动态分区准备即可!

1、在上面第一个“执行SQL任务”中,按照以下配置:

SQLStatment语句:得到当前月份

SELECT ‘Drug DW‘                                                        AS DataSoureID,--数据源

       ‘Drug_SSAS‘                                                       AS DatabaseID,--分区来自哪一个cube
       ‘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 ‘ +left(convert(varchar(10),getdate(),112),6) AS Partition--分区名称=度量值组名称+年月

返回值:

结果集:  

2、执行下的脚本:主要是删除当前月份的分区,当前月份分区存在就删掉,不存在则执行生成分区的任务!

/*
   Microsoft SQL Server Integration Services Script Task
   Write scripts using Microsoft Visual C# 2008.
   The ScriptMain is the entry point class of the script.
*/

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using Microsoft.AnalysisServices;
namespace ST_c86e3263ba3a4082bcf1335a1946efbb.csproj
{
    [System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")]
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    {

        #region VSTA generated code
        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 =(String) Dts.Variables["Partition"].Value;

            String sCubeName = (String) Dts.Variables["CubeName"].Value;
            String sMeasureGroup = (String) Dts.Variables["MeasureGroup"].Value;

            String sServer = (String)Dts.Variables["IPserver"].Value;

            String sDataBaseID = (String) Dts.Variables["DatabaseID"].Value;

            String sCubeID = (String) Dts.Variables["CubeID"].Value;

            String sMeasureGroupID = (String) Dts.Variables["MeasureGroupID"].Value;

            String sDataSoureID = (String)Dts.Variables["DataSourceID"].Value;

            ConnectionManager cm = Dts.Connections.Add("MSOLAP100");
            cm.ConnectionString = "Provider=MSOLAP.4;Data Source="+sServer+";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["XmlStr"].Value = "<Delete xmlns=\"http://schemas.microsoft.com/analysisservices/2003/engine\">"
                + " <Object>"
              + "<DatabaseID>" + sDataBaseID + "</DatabaseID>"
             + "<CubeID>" + sCubeID + "</CubeID>"
            + "<MeasureGroupID>" + sMeasureGroupID + "</MeasureGroupID>"
            + "<PartitionID>" + sPartition + "</PartitionID>"
           + "</Object>"
           + "</Delete> ";
                Dts.TaskResult = (int)ScriptResults.Success;

            }

        }
    }
}
时间: 2024-10-30 02:49:43

SSIS动态删除分区的相关文章

SSAS动态添加分区(一)

一.动态分区的好处就不说了,随着时间的推移,不可能一个度量值组都放在一个分区中,处理速度非常慢,如何动态添加分区,如何动态处理分区,成为了很多新手BI工程师一个头痛的问题,废话不多说,分享一下我的经验. 二.首先讲一下大致的流程,主要是通过SSIS进行任务的处理,本文主要是按照月进行分区,当然分区的规则大家可以根据自己的需求制定. 该包用到的所有变量 三.对上面四个步骤分别讲解一下. 1.得到所有分区: ①.主要设置如下图 ②.输出的结果集应该传给变量Partitions ③.SQLStatem

linux 硬盘分区,分区,删除分区,格式化,挂载,卸载笔记

Linux 虽然一直都有在玩,但是对硬盘操作确实不是很熟悉今天有空,就整理了下. 1, 创建分区 先查看下是否有磁盘没有分区 [html] view plaincopy fdisk -l 其中第一个框和第二个框,是已经分好区的磁盘,第三个硬盘没有分区. 开始分区 [html] view plaincopy fdisk /dev/sdc 输入m,可以查看有哪些操作 输入p 查看当前硬盘分区,目前没有分区. 输入n新建一个分区,输入p 建立分区,输入分区编号 1 然后会让你设置开始扇区(不知道是否这

js动态删除div元素

在做用户查找时 因为要把查找的结果动态加载和显示,所以,那些html元素要由Ajax动态生成.用户打开查找界面时,有系统推荐的用户,而当用户按条件查找后,查找的结果动态加载和显示.所以考虑到用js来搞. 这个for循环就是移除已有的表单.然后根据Ajax请求过来的数据,动态生成新的表单对象.一定要注意j变量从大往小循环,否则,删除div元素后会引起serchResultLenth=serchResult.children.length;长度的变化(这个问题摸索了好久,才搞定,切记) for(va

Linux下进行硬盘挂载、分区、删除分区,格式化,挂载,卸载方法

本文简单介绍了下文件系统及其操作(df命令),磁盘分区.格式化,还有最主要是挂载操作. 在这里对"挂载"做个说明,我们都知道文件系统是创建在磁盘上面的,每个文件系统都有独立的inode.block等信息,而这个文件系统要能连接到目录树才能被我们访问.将文件系统与目录树产生关联的操作我们就成为挂载.即将文件系统挂载到某个目录下,该目录为进入该文件系统的入口. 一.  创建分区 先查看下是否有磁盘没有分区 fdisk -l 其中第一个框是已经分好区的磁盘,第二.三个硬盘没有分区.下面开始分

3. 文件系统——创建、删除分区和内核同步分区信息

一.创建分区 如果使用fdisk命令来创建.删除.修改分区,可以直接使用fdisk [DEVICE]来操作,如: # fdisk /dev/sda 但需要注意的是,用命令来操作硬件,很容易造成数据丢失,故务必谨慎使用. fdisk命令是个交互命令,使用fdisk [DEVICE] 时,系统会提示各种可以使用的选项: [[email protected] ~]# fdisk /dev/sda # 不要加上 -l选项 --------------运行结果----------------- WARNI

[Nutch]Hadoop动态删除DataNode节点和TaskTracker节点

在之前的博文有说明动态添加一个结点,本次就说明如何动态删除一个结点. 在上一篇博文有讲解如何限制一个结点的连接,要动态删除一个结点,可以在这个基础之上进行配置. 1. 在host1上配置dfs.hosts.exclude 在dfs.hosts.exclude指定的文件中添加host4: 再执行如下命令: hadoop dfsadmin -refreshNodes 然后用如下命令进行查看: hadoop dfsadmin -report 如下: 2. web界面 从web管理界面可以看到,目前只有

Linux 硬盘分区、分区、删除分区、格式化、挂载、卸载

Linux 虽然一直都有在玩,但是对硬盘操作确实不是很熟悉今天有空,就整理了下. 1,创建分区 先查看下是否有磁盘没有分区 fdisk -l 其中第一个框和第二个框,是已经分好区的磁盘,第三个硬盘没有分区. 开始分区 fdisk /dev/sdc 输入m,可以查看有哪些操作 输入p 查看当前硬盘分区,目前没有分区. 输入n新建一个分区,输入p 建立分区,输入分区编号 1 然后会让你设置开始扇区(不知道是否这么解释):默认回车就是1  从头开始 然后结束扇区设置1000   这个值好像决定了分区的

Linux 硬盘格式化、分区、挂载、卸载、删除分区

Linux 硬盘格式化.分区.挂载.卸载.删除分区 Linux 2.6 kernel以后,linux会将识别到的硬件设备,在/dev/下建立相应的设备文件.如: sda 表示第1块SCSI硬盘 hda 表示第1块IDE硬盘(即连接在第1个IDE接口的Master口上) scd0 表示第1个USB光驱. 0. 查看挂载情况 df -hl 看到系统只挂载了40G的 /dev/vda1 在 / 目录下, 分别分给了不同文件夹 1. 查看硬盘信息 fdisk -l 有一个 20G 的 /dev/vdb

hive 添加和删除分区

命令如下: 增加分区 alter table my_partition_test_table if not exists add partition (p_hour='2017113003', p_city='573', p_loctype='MHA'); 删除分区 ALTER TABLE my_partition_test_table DROP IF EXISTS PARTITION (p_loctype='MHA'); 原文地址:https://www.cnblogs.com/drjava/