有时工作中要建个分区函数,可是像日期这种分区函数要是搞个几百个的值那不是要搞死我。于是写了点代码自动生成一个从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. RNA-seq分析htseq-count的使用

    HTSeq作为一款可以处理高通量数据的python包,由Simon Anders, Paul Theodor Pyl, Wolfgang Huber等人携手推出HTSeq — A Python fra ...

  2. 115th LeetCode Weekly Contest Prison Cells After N Days

    There are 8 prison cells in a row, and each cell is either occupied or vacant. Each day, whether the ...

  3. Wscript.Shell 对象详细介绍

    详细 WshShell 对象ProgID Wscript.Shell 文件名 WSHom.Ocx CLSID F935DC22-1CF0-11d0-ADB9-00C04FD58A0B IID F935 ...

  4. docker run、commit报错

    1.docker commit 报错 Error response from daemon: devmapper: Error mounting '/dev/mapper/docker-253:2-1 ...

  5. Python 读取Excel数据 xlrd

    #导入相关模块 from xlrd import open_workbook #打开excel file = open_workbook("test.xlsx") #获取sheet ...

  6. cloudemanager安装时出现ProtocolError: <ProtocolError for 127.0.0.1/RPC2: 401 Unauthorized>问题解决方法(图文详解)

    不多说,直接上干货! 问题详情 查看日志/var/log/cloudera-scm-agent/,得知 解决办法 $> ps -ef | grep supervisord $> kill ...

  7. unity发布安卓lua路径不存在问题

    项目用的是xlua 采用自定义加载方式 使用File去读取路径下的文件,lua文件本来放在了StreamingAssets路径下 PC运行无问题,发布安卓后,居然提示路径不存在. 查了下资料后发现,F ...

  8. Django 入门项目案例开发(上)

    关注微信公众号:FocusBI 查看更多文章:加QQ群:808774277 获取学习资料和一起探讨问题. Django 入门案例开发(中) http://www.cnblogs.com/focusBI ...

  9. Sublime Text加上Eclipse

    打造属于自己的前端开发神器 -- 给Sublime Text加上Eclipse的光环     将Sublime Text打造成如Eclipse一般的前端开发IDE 1. 快捷键移植篇   从Java开 ...

  10. js根据子目录数目显示父级目录

    需求:<ul>中<li>数量为0,则不显示<ul>以及<b>:<div>中<ul>数量为0,则不显示<div> 1. ...