如何按月(“年”和“月”)对表进行分区并自动创建每月分区?

2024-05-07

我正在尝试按两者对表进行分区Year and Month。我将通过其进行分区的列是具有 ISO 格式(“20150110”、20150202”等)的日期时间类型列。

例如,我有 2010 年、2011 年、2012 年的销售数据。我希望数据按年份分区,每年也按月份分区。 (2010/01, 2010/02, ... 2010/12, 2011/01, ... 2015/01...)

E.X:

2010 年一月销售额、2010 年二月销售额、2011 年一月销售额、2011 年二月销售额、2012 年十二月销售额等

我的问题是:这可能吗?如果是,我如何使用 SSIS 自动化该过程?


SSIS 是一个 ETL(提取、转换、加载)。这不是你想做的。 您只需要动态创建 DDL 语句。

我使用下面的季度,但如果你愿意的话,它也适用于 1、2 或 X 个月。

如果要对表进行分区,首先需要创建文件、文件组和分区表并手动设置分区

在具有 int 标识 PK 和 datetime2 分区列的表上为 2015 年第一季度(之前、第一季度和第二季度之后)创建 N+1 个分区。 更新它以添加月份、每月或任何您需要的内容......

  • 首先创建N个文件组:

    Alter Database [Test] Add Filegroup [Part_Before2015]
    Go
    Alter Database Test Add Filegroup [Part_201501]
    Go
    Alter Database Test Add Filegroup [Part_201504]
    Go
    
  • 为每个文件组添加一个文件:

    Alter Database [Test] Add FILE ( NAME = N'Part_Before2015', FILENAME = N'...\Part_Before2015.ndf' , SIZE = 5120KB , FILEGROWTH = 1024KB ) TO Filegroup [Part_Before2015]
    Alter Database [Test] Add FILE ( NAME = N'Part_201501', FILENAME = N'...\Part_201501.ndf' , SIZE = 5120KB , FILEGROWTH = 1024KB ) TO Filegroup [Part_201501]
    Alter Database [Test] Add FILE ( NAME = N'Part_201504', FILENAME = N'...\Part_201504.ndf' , SIZE = 5120KB , FILEGROWTH = 1024KB ) TO Filegroup [Part_201504]
    
  • 在 datetime2 类型(或 date 甚至 datetime)上创建分区函数:

    Create Partition Function RangePartFunction (datetime2)
    as Range Right For Values ('20150101', '20150401') 
    
  • 在每个文件组 (N+1) 上使用分区函数创建分区方案:

    Create Partition Scheme RangePartScheme as Partition RangePartFunction
    To ([Part_Before2015], [Part_201501], [Part_201504])
    
  • 根据其分区方案创建分区表:

    Create TABLE [PartitionTable] (id int identity(0, 1) not null, date datetime2 not null, text char(8000))
    On RangePartScheme (date) ;
    
  • 在分区列和分区方案上添加聚集索引:

    Create Clustered Index IDX_Part On dbo.PartitionTable(date) 
        On RangePartScheme (date);
    
  • 将 PK 添加到 id 列:

    Alter Table dbo.PartitionTable Add COntraint PK_Part Primary Key Nonclustered(id, date);
    

构建用于在右边界后添加额外文件组并分割最后一个分区的查询

  • 回顾分区方案扩展和分区函数拆分
  • 审查使用的 DMV
  • 查看所有这些以及如何使用它来创建动态 SQL

    Declare @currentDate datetime2
    Declare @endDate datetime2 = '20160701' -- new end date
    Declare @dateAdd int = 3 -- Add 3 month = 1 Quarter
    
    -- Get Current boundaries 
    Select @currentDate = DATEADD(MONTH, @dateAdd,Cast(MAX(value) as datetime2)) From sys.partition_range_values as r
        Inner Join sys.partition_functions as f on r.function_id = f.function_id
    Where f.name = 'RangePartFunction'
    
    -- Get all quarters between max and end date
    ; with d(id, date, name) as (
        Select 0, @currentDate, Convert(char(6), @currentDate, 112)
        Union All
        Select id+1, DATEADD(MONTH, @dateAdd, date), Convert(char(6), DATEADD(MONTH, @dateAdd, date), 112)
        From d Where d.date <= @endDate
    )
    Select * From (
        Select id = id*10, query = 'If Not Exists(Select 1 From sys.filegroups Where name = ''Part_'+name+''')
            Begin 
                Print ''Create Filegroup [Part_'+name+']''
                Alter Database [Test] Add Filegroup [Part_'+name+']
            End
            GO'
        From d
        Union All
        Select id*10+1, 'If Not Exists(Select 1 From sys.sysfiles Where name = ''Part_'+name+''')
            Begin 
                Print ''Create File [Part_'+name+'.ndf]''
                Alter Database [Test] Add FILE ( NAME = N''Part_'+name+''', FILENAME = N''C:\DB\MSSQL11.MSSQLSERVER\MSSQL\DATA\Part_'+name+'.ndf'' , SIZE = 5120KB , FILEGROWTH = 1024KB ) TO Filegroup [Part_'+name+']
            End
            GO'
        From d
        Union All
        Select id*10+2, 'Print ''Add Range [Part_'+name+']''
            Alter Partition Scheme RangePartScheme Next Used [Part_'+name+']
            Go'
        From d
        Union All
        Select id*10+3, 'Print ''Split Function ['+Convert(char(8), date, 112)+']''
            Alter Partition Function RangePartFunction() Split Range ('''+Convert(char(8), date, 112)+''');
            Go'
        From d
    ) as q order by id
    

该查询的输出是必须按顺序运行的 SQL 查询的列表。

执行动态SQL

  • 可以手动执行(在SSMS中复制粘贴)
  • 它可以在 while 循环中执行,也可以使用游标执行,游标将逐行执行输出表的每一行(使用 sp_executesql)

自动化

  • 创建执行 SQL 查询的 SQL Server 作业:运行用于创建动态 SQL 的查询,将其输出保存到表变量中,然后使用循环/游标执行每个语句

如果您想每月运行一次并确保始终创建接下来的 12 个月,请使用此Set @endDate = DATEADD(MONTH, 12, getdate())

Finally

  • 它将输出函数最后一个边界和 @endDate 之间 N 个缺失四分之一的 4*N 行:

    • 创建文件组
    • 在文件组上创建文件
    • 扩展分区方案的范围
    • 分割配分函数的范围
  • 您可以使用光标或 while 循环逐行运行它,也可以将其复制并粘贴到 SMSS 中。

  • 它也可以通过工作实现自动化,即。@endDate = DATEADD(MONTH, 3, getdate()将创造未来3个月
  • 如果您想要每月分区,请将 @dateAdd 更改为 1
  • 添加您自己的列或检查

Link

创建工作 =https://www.mssqltips.com/sqlservertip/3052/simple-way-to-create-a-sql-server-job-using-tsql/ https://www.mssqltips.com/sqlservertip/3052/simple-way-to-create-a-sql-server-job-using-tsql/

sp_executesql =https://technet.microsoft.com/en-us/library/ms188001%28v=sql.110%29.aspx https://technet.microsoft.com/en-us/library/ms188001%28v=sql.110%29.aspx

while循环=https://dba.stackexchange.com/questions/57933/can-exec-work-with-while-loop-of-cursor https://dba.stackexchange.com/questions/57933/can-exec-work-with-while-loop-of-cursor

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何按月(“年”和“月”)对表进行分区并自动创建每月分区? 的相关文章

  • 为表多次指定了 xxx 列

    我正在尝试将 db2 简单查询调整为 SQL SERVER 该查询在 db2 上运行良好 select from pb console users u join select from pb console users user role
  • 帮助将二进制图像数据从 SQL Server 读取到 PHP 中

    我似乎无法找到将二进制数据从 SQL 服务器读取到 PHP 的方法 我正在开发一个项目 需要能够将图像直接存储在 SQL 表中 而不是文件系统上 目前 我一直在使用这样的查询 插入 myTable 文档 选择 从 OPENROWSET BU
  • 如何跳过 SSIS 数据流中的最后一行

    我在用FlatFile Source Manager gt Script COmponent as Trans gt OLEDB destination在我的数据流中 源从平面文件读取所有行 我想跳过更新数据库的最后一行 预告片记录 由于它
  • REPLACE MYSql 中的新行字符不起作用

    我执行了以下查询 由于某种原因它没有替换数据库中的换行符 它说 Rows matches 1 但没有变化 有什么问题吗 mysql gt UPDATE aboutme SET abouttext REPLACE abouttext n WH
  • 为什么 SQL Server 不推荐使用 SET ANSI_PADDING OFF?

    根据 MSDN BOL 在线书籍 SET ANSI PADDING http msdn microsoft com en us library ms187403 aspx 在 Microsoft SQL Server 的未来版本中 ANSI
  • DBCC命令是存储过程还是函数?

    应该是什么DBCC命令被调用 DBCC 过程还是 DBCC 函数 这很令人困惑 因为DBCC PAGE可以在不加前缀的情况下执行EXEC语句很像存储过程 但EXEC DBCC PAGE 1 1 1 3 抛出错误 语法错误 消息 156 关键
  • .net 应用程序中的内存泄漏

    我正在 VB net 2005 中开发一个桌面应用程序 该应用程序包含一个间隔为 1 分钟的计时器 每次计时器计时 就会执行一组函数 大部分与数据库相关 最初 应用程序运行良好 在进程 任务管理器 中 每次调用计时器时 CPU 使用率都会达
  • 从多行中获取/选择值到sql server中的1行中

    我有一个表格 每列都有一些图像 Acd unq id Emp unq id Acd BImg1 Acd BImg2 Acd RImg1 Acd RImp2 Acd RImg3 Acd Active 1 1745 BinaryImg Bina
  • 转置和聚合 Oracle 列数据

    我有以下数据 Base End RMSA Item 1 RMSA Item 2 RMSA Item 3 RMSB Item 1 RMSB Item 2 RMSC Item 4 我想将其转换为以下格式 Key Products RMSA RM
  • glm() 模型的交叉验证

    我正在尝试对我之前在 R 中构建的一些 glm 模型进行 10 倍交叉验证 我对cv glm 函数在boot包 尽管我已经阅读了很多帮助文件 当我提供以下公式时 library boot cv glm data glmfit K 10 这里
  • 如何在 SQL 中选择“上一条”和“下一条”记录?

    I am building a blog post detail page on my site that will display display a previous and next link similar to how a typ
  • Postgres 上的 C 语言环境和 Posix 语言环境有什么区别?

    我知道 Postgres 上的数据库区域设置负责国家字符的正确顺序 正确的小写 大写等 但为什么有两种语言中立的语言环境 posix and c 它们之间有什么区别 还是只是一个中立的语言环境有两个不同的名称 UPDATE正如 Magnus
  • 不同提供商的相同 EDMX 文件

    我正在开发一个项目 其中有一个本地数据库 SQL CE 在不存在与服务器的连接的情况下用作缓冲区 在服务器上我想使用相同的数据库布局 当然 我想使用服务器和客户端上可用的 Common dll 中的相同 EDMX 文件 在客户端中 我有一个
  • 如何在 SQL 中进行广度优先搜索?

    给定一棵存储为关系的树 Parent Child 1 2 1 3 3 4 3 5 2 6 7 8 7 9 如何获取给定节点的所有后代 例如 对于 1
  • 在 WHERE 子句中使用可选参数

    我有一个SP ALTER PROCEDURE dbo sp Compare lst varchar 100 frst varchar 100 NULL passportNo varchar 50 NULL AS SELECT FROM db
  • 查询链接服务器时登录失败

    我正在尝试在 SQL Server 中创建链接服务器 Create the link to server uranium EXEC master dbo sp addlinkedserver server N uranium srvprod
  • sql查询中case语句中的布尔值

    我在选择查询中使用 case 语句 类似这样 Select col1 col2 isActive case when col3 abc then 1 else 0 end col4 from
  • 如何比较 Postgresql 中日期时间字段中的日期?

    在比较 postgresql Windows 中的版本 9 2 4 中的日期时 我遇到了一个奇怪的情况 我的表中有一列说update date与类型timestamp without timezone 客户可以仅使用日期搜索此字段 例如 2
  • 如何使用 ALTER TABLE 添加新列并使其唯一?

    我该如何使用ALTER TABLE添加新列并使其独一无二 取决于 DBMS 但我认为以下内容相当可移植 ALTER TABLE table name ADD column name datatype ALTER TABLE table na
  • mysql 中 INSERT 语句的计算列

    假设我想要一个表来记录其他表中的日期和列数 或者任何类型的数学 字符串连接等 CREATE TABLE log id INTEGER NOT NULL AUTO INCREMENT date DATETIME NOT NULL count

随机推荐