有时工作中要建个分区函数,可是像日期这种分区函数要是搞个几百个的值那不是要搞死我。于是写了点代码自动生成一个从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. [BZOJ 3613][Heoi2014]南园满地堆轻絮

    传送门 这题......注意读题就行 刚开始读成了Ans = Σ{|A[j]-B[j]|}以为是道神题,结果是Ans = Max{|A[j]-B[j]|}. 嗯.......可以证明Ans = 最大的 ...

  2. POJ1077 Eight A*

    这个题扔到A*可也还行... 定义估价函数h():为每个数或空格的位置 到 最终状态中所在位置 的 曼哈顿距离 的 总和. 把状态压成一个九进制数,便于存储和判重. 然后记录方案可以记录一下此次的操作 ...

  3. C# 获取控制面板软件信息

    一般情况下要知道的注册表位置 Software\Microsoft\Windows\CurrentVersion\Uninstall 要知道的根目录集合 List<RegistryKey> ...

  4. LightOJ - 1234 分块预处理

    求∑1/i,但是范围很大 和bitmap的想法一样,分个块,均摊复杂度就降下来了 //到底排行榜上的0ms是怎么做到的? #include<bits/stdc++.h> using nam ...

  5. PIE SDK矢量数据的修改

    1.功能简介 目前PIE SDK支持矢量数据的修改或删除,下面对矢量数据的投影转换功能进行介绍. 2.功能实现说明 2.1. 矢量数据的修改 2.2. 实现思路及原理说明 第一步 获取需要修改的矢量数 ...

  6. SQL异常捕获

    直接上代码: GO BEGIN TRY DECLARE @res INT SET @res=1/0 PRINT 'no error' END TRY BEGIN CATCH PRINT 'Error ...

  7. zabbix 报警程序

    一,报警程序 本次使用的为onealert http://c.onealert.com/console/ucid/login.jsp 二,服务端安转 下面为他教的怎么安装这个东西 第一步: 找到脚本目 ...

  8. ife task0003学习笔记(五):JavaScript面向对象

    JavaScript 支持函数式编程.闭包.基于原型的继承等高级功能.在 Java 等面向对象的语言中,this 关键字的含义是明确且具体的,即指代当前对象.而在 JavaScript 中,this ...

  9. ElasticSearch 2.1.1学习及总结

    Install & Up cd elasticsearch-2.1.1/bin ./elasticsearch ./elasticsearch --cluster.name my_cluste ...

  10. win7远程登录

    开始--附件--远程桌面连接 点击显示选项 填写信息,连接上了. 分配磁盘 计算机---右键----管理