有时工作中要建个分区函数,可是像日期这种分区函数要是搞个几百个的值那不是要搞死我。于是写了点代码自动生成一个从1990年开始的按月的分区函数和对应的分区主题

USE [TestDB]
GO DECLARE @STR NVARCHAR(MAX)
SET @STR = 'CREATE PARTITION FUNCTION [PF_RangeByMonth_FromYear1990](DATETIME) AS
RANGE LEFT FOR VALUES (' DECLARE @STR2 NVARCHAR(MAX)
SET @STR2 = 'CREATE PARTITION SCHEME [PS_RangeByMonth_FromYear1990] AS PARTITION [PF_RangeByMonth_FromYear1990] TO (' --generate corresponding partition function script
SELECT @STR + STUFF((SELECT ''',''' + CONVERT(VARCHAR, DATEADD(MONTH,ID-1,'1990-01-01'), 121)
FROM [dbo].[Numbers]
WHERE ID <= DATEDIFF(MONTH,'1990-01-01','2040-01-01')+1
ORDER BY [ID]
FOR XML PATH(''), TYPE).value('.', 'varchar(max)')
,1,2,'') + ''')' + CHAR(13) as 'partition function script' --generate corresponding partition scheme script
SELECT @STR2 + STUFF((SELECT +', [PRIMARY]'
FROM [dbo].[Numbers]
WHERE ID <= DATEDIFF(MONTH,'1990-01-01','2040-01-01')+2
FOR XML PATH(''), TYPE).value('.', 'varchar(max)')
,1,2,'') + ')' + CHAR(13) as 'partition scheme script'

--------------------- 2015/10/10 Update ---------------------------------------------------------------

万一需要自动生成一个按周或者特定天数一段段的这种,可以用下面的脚本

USE Mydb
GO IF OBJECT_ID('tempdb..#t') IS NOT NULL
DROP TABLE #t
GO CREATE TABLE #t([NO] INT IDENTITY(1,1), cmd_type NVARCHAR(10),partial_cmd NVARCHAR(MAX))
GO DECLARE @STR NVARCHAR(MAX)
SET @STR = 'CREATE PARTITION FUNCTION [PF_RangeByWeek_FromYear1990](DATETIME) AS
RANGE LEFT FOR VALUES (' DECLARE @STR2 NVARCHAR(MAX)
SET @STR2 = 'CREATE PARTITION SCHEME [PS_RangeByWeek_FromYear1990] AS PARTITION [PF_RangeByWeek_FromYear1990] TO (' INSERT #t(cmd_type, partial_cmd) VALUES('PF', @STR), ('PS', @STR2) DECLARE @b_date DATETIME,
@e_date DATETIME,
@curr_date DATETIME,
@end INT = 0,
@time INT = 7,
@i INT = 365 SELECT @b_date = '1990-01-01',
@e_date = '2040-01-01' SELECT @curr_date = @b_date,
@i = CASE WHEN @i > DATEDIFF(DAY,@b_date,@e_date) THEN DATEDIFF(DAY,@b_date,@e_date) ELSE @i END WHILE 1 = 1
BEGIN
PRINT @curr_date
INSERT #t(cmd_type, partial_cmd)
--generate corresponding partition function script
SELECT cmd_type, IIF(@curr_date = @b_date, RIGHT([partition function script],LEN([partition function script])-1), [partition function script])
FROM (
SELECT 'PF' cmd_type,
STUFF((SELECT ''',''' + CONVERT(NVARCHAR(MAX), DATEADD(DAY,@time*(ID-1),@curr_date), 121)
FROM [dbo].[Numbers]
WHERE ID <= @i
ORDER BY [ID]
FOR XML PATH(''), TYPE).value('.', 'nvarchar(max)')
,1,1,'') + '''' as 'partition function script') t INSERT #t(cmd_type, partial_cmd)
--generate corresponding partition scheme script
SELECT cmd_type, IIF(@curr_date = @b_date, RIGHT([partition scheme script],LEN([partition scheme script])-1), [partition scheme script])
FROM (
SELECT 'PS' cmd_type,
(SELECT ',' + ' [DATA]'
FROM [dbo].[Numbers]
WHERE ID <= @i
FOR XML PATH(''), TYPE).value('.', 'nvarchar(max)') as 'partition scheme script') t IF @end = 1
BEGIN
INSERT #t(cmd_type, partial_cmd) VALUES('PS',', [DATA]'),('PF',')'),('PS',')')
BREAK
END IF DATEADD(DAY,(@i*@time*2)-1,@curr_date)>=@e_date
BEGIN
SET @curr_date = DATEADD(DAY,@i*@time,@curr_date)
SET @i = (DATEDIFF(DAY,@curr_date,@e_date)/@time)+2
SET @end = 1
END
ELSE
BEGIN
SET @curr_date = DATEADD(DAY,@i*@time,@curr_date)
END END SELECT partial_cmd
FROM #t
WHERE cmd_type = 'PF'
ORDER BY cmd_type, NO SELECT partial_cmd
FROM #t
WHERE cmd_type = 'PS'
ORDER BY cmd_type, NO

SQL Server ->> 生成时间类型的Partition Function和Partition Scheme代码的更多相关文章

  1. SQL Server 日期 时间类型

    --1毫秒=0.001秒 --1微秒=0.000 001秒 --1纳秒=0.000 000 001秒 --datetime精度不大好,末尾值只能是这3种: .000, .003, or .007 -- ...

  2. .SQL Server中 image类型数据的比较

    原文:.SQL Server中 image类型数据的比较 在SQL Server中如果你对text.ntext或者image数据类型的数据进行比较.将会提示:不能比较或排序 text.ntext 和 ...

  3. SQL Server 取日期时间格式 日期与字符串之间的转换

    SQL Server 取日期时间部分   在本文中,GetDate()获得的日期由两部分组成,分别是今天的日期和当时的时间: Select GetDate()  用DateName()就可以获得相应的 ...

  4. SQL Server数据库字段类型说明

    SQL Server数据库字段类型说明 目前Sql Server 数据库一共有X个字段类型,大体分为9类,分别是字符串类型.二进制码字符串数据类型.Unincode字符串数据.整数类型.精确数据类型. ...

  5. sql server日期时间转字符串

    一.sql server日期时间函数Sql Server中的日期与时间函数 1.  当前系统日期.时间     select getdate()  2. dateadd  在向指定日期加上一段时间的基 ...

  6. SQL Server日期时间格式转换字符串详解 (详询请加qq:2085920154)

    在SQL Server数据库中,SQL Server日期时间格式转换字符串可以改变SQL Server日期和时间的格式,是每个SQL数据库用户都应该掌握的.本文我们主要就介绍一下SQL Server日 ...

  7. SQL Server日期时间格式转换字符串

    在SQL Server数据库中,SQL Server日期时间格式转换字符串可以改变SQL Server日期和时间的格式,是每个SQL数据库用户都应该掌握的.本文我们主要就介绍一下SQL Server日 ...

  8. ADO.NET 快速入门(十二):从 SQL Server 生成 XML 数据

    本文演示如何使用2种不同的方法从 SQL Server 生成 XML.   方法1:使用了 SqlCommand 的 ExecuteXmlReader 方法获取 XmlReader,然后使用 Data ...

  9. sql server日期时间转字符串(转)

    一.sql server日期时间函数Sql Server中的日期与时间函数 1.  当前系统日期.时间     select getdate()  2. dateadd  在向指定日期加上一段时间的基 ...

随机推荐

  1. 数据结构5.4_m元多项式的表示

    三元多项式表示如下: P(x,y,z) = x10y3z2 + 2x6y3z2 + 3x5y2z2 + x4y4z + 6x3y4z + 2yz + 15 然后对式子进行变形: P(x,y,z)=(( ...

  2. 2018acm-icpc青岛站心得

    今年总共两场区域赛,一场南京,一场青岛.南京场队伍真正开始磨合,虽然最后还是铜牌,但是和银牌队伍其实只差一个计算几何的板子的问题.而鉴于南京的教训,所以在准备青岛站的时候,我准备了非常多的模板,还和派 ...

  3. HDU - 2276 位运算矩阵快速幂

    挺有意思的一道题 要会运用一些常见的位运算操作进行优化 题目的本质就是要求下面的式子 \(dp[i][j+1]=(dp[i-1][j]+dp[i][j]) \mod 2\) (第\(i\)个字符在\( ...

  4. Randy Pausch’s Last Lecture

          he University of Virginia American Studies Program 2002-2003.                     Randy Pausch ...

  5. TT 安装之 Windwos

    WINDOWS在 控制面板-〉管理工具-〉本地安全策略-〉本地策略-〉用户权限分配-〉锁定内存页-〉添加用户或组-〉高级查找 然后确定 然后安装 (WINDOWS在 控制面板-〉管理工具-〉ODBC工 ...

  6. APP在实际开发中应注意的关键点

    在APP开发过程中,开发者比较注重的是功能模块的实现,从而忽略了APP的设计问题,特别是企业开发APP,但是,APP设计是APP开发中非常重要的一个环节,APP界面设计直接影响到APP用户的感官,因此 ...

  7. oracle 备份恢复篇(一)---rman

    一,rman介绍 RMAN(Recovery Manager)是随Oracle服务器软件一同安装的工具软件,它可以用来备份和恢复数据库文件.归档日志和控制文件,用来执行完全或不完全的数据库恢复.与传统 ...

  8. oracle 单实例DG(切换篇三)

    一,开篇 此篇操作承接上文,必须完成DG实例搭建完成方可有执行以下内容的实例 二,切换物理备库 one. oracle01库命令 select switchover_status from v$dat ...

  9. log4j整理

    <meta http-equiv="refresh" content="1"/> # log4j日志组件 #- SLF4J,一个**通用日志接口** ...

  10. 原生JS写的ajax函数

    参照JQuery中的ajax功能,用原生JS写了一个ajax,功能相对JQuery要少很多,不过基本功能都有,包括JSONP. 调用的方式分为两种: 1. ajax(url, {}); 2. ajax ...