SQL分区中SUBSTRING的使用

时间:2016-09-01 05:56:38

标签: sql sql-server database sql-server-2012

我创建了一个表并对其进行了分区(代码为here,请参阅水平分区示例,并创建新的分区表部分) 我使用了以下分区功能

CREATE PARTITION FUNCTION [PartitioningByMonth] (datetime)
AS RANGE RIGHT FOR VALUES ('20140201', '20140301', '20140401',
               '20140501', '20140601', '20140701', '20140801', 
               '20140901', '20141001', '20141101', '20141201'); 

我的SCHEMA

CREATE PARTITION SCHEME PartitionBymonth
AS PARTITION PartitioningBymonth
TO (January, February, March, 
    April, May, June, July, 
    Avgust, September, October, 
    November, December);

我的表创建查询

CREATE TABLE Reports
(ReportDate datetime PRIMARY KEY,
MonthlyReport varchar(max))
ON PartitionBymonth (ReportDate);
GO

如果我在 2014(我的意思是2014010520140205,......)中插入的值,它就有效罚款:

INSERT INTO Reports (ReportDate,MonthlyReport)
SELECT '20140105', 'ReportJanuary' UNION ALL
SELECT '20140205', 'ReportFebryary' UNION ALL
SELECT '20140308', 'ReportMarch' UNION ALL

但是当我插入201520162017的任何值时会出现问题.....:

   INSERT INTO Reports (ReportDate,MonthlyReport)
    SELECT '20150105', 'ReportJanuary' UNION ALL
    SELECT '20150206', 'ReportFebryary' UNION ALL
    SELECT '20150309', 'ReportMarch' UNION ALL

因为它只推送最后一个分区(20141201我的意思是December分区)。但我希望他们转到JanuaryFebruaryMarch分区。 我知道我的问题出在PARTITION FUNCTION,因为我在2014年只写了(' 20140201',#201; 20140301' ......)。 但是我想计算。这有什么办法让它只看到2015年 03 01而不是年或者一个月。(我可以使用SUBSTRING吗?任何部分)

2 个答案:

答案 0 :(得分:1)

您可以将计算列添加到表中

ReportDateP as MONTH(ReportDate) PERSISTED

并在此计算列

上创建包含分区的表

然后按如下所示创建分区函数

CREATE PARTITION FUNCTION [NewPartitioning] (int)
AS RANGE RIGHT FOR VALUES (2,3,4,5,6,7,8,9,10,11,12); 

答案 1 :(得分:0)

您无法在Partions系统中使用SubQuery。使用Eralper方法对此部分进行分区

CREATE PARTITION SCHEME PartitionBymonth
AS PARTITION PartitioningBymonth
TO (January, February, March, 
    April, May, June, July, 
    Avgust, September, October, 
    November, December);