目前接到一个需求,将一个table安装日期和工厂进行分区操作。table 'T1' 字段如下[WERKID] [NVARCHAR(4)] NOT NULL,
[NUM] [NVARCHAR(13)] NOT NULL,
[ProductID] [NVARCHAR(18)] NULL,
[BUDAT] [NVARCHAR(8)] NULL,
[CHDAT] [NVARCHAR(8)] NULL,
[CHMAN] [NVARCHAR(10)] NULL需求:按照WERKID 及 BUDAT 对 T1进行分区条件1:WERKID =1001    、  WERKID = 2002 、 OTHERS条件2: BUDAT < 2011.12.31 、 BUDAT < 2012.12.31  、 BUDAT < 2013.21.31 、 OTHERS一共分为 3 * 4 = 12 个分区。请教解决方案,如果有,请麻烦写详细一点,呵呵 TKS 

解决方案 »

  1.   

    你这个好像类似于ORACLE的子分区问题。SQL Server 记得没有提供子分区的功能。你再找找看吧。其他的分区,参考如下:
    /*
    1.创建分区函数
    */CREATE PARTITION FUNCTION
    pf_test(int)
    as range left
    for values(500,1000)/*
    2. 创建不同的文件组
    */
    Alter DATABASE AdventureWorks
    add filegroup fg01
    Alter DATABASE AdventureWorks
    add filegroup fg02
    Alter DATABASE AdventureWorks
    add filegroup fg03ALTER DATABASE AdventureWorks
    add file
    (
    name=file01,
    filename='C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\file01.mdf',
    size=5mb,
    filegrowth=1mb
    )
    to filegroup fg01
    ALTER DATABASE AdventureWorks
    add file
    (
    name=file02,
    filename='C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\file02.mdf',
    size=5mb,
    filegrowth=1mb
    )
    to filegroup fg02
    ALTER DATABASE AdventureWorks
    add file
    (
    name=file03,
    filename='C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\file03.mdf',
    size=5mb,
    filegrowth=1mb
    )
    to filegroup fg03/*
    3.创建scheme
    */CREATE PARTITION SCHEME ps_test
    AS PARTITION pf_test
    TO([FG01],[FG02],[FG03])/*
    4.创建table
    */
    CREATE TABLE [dbo].[TestDatabaseLog](
    [DatabaseLogID] [int] IDENTITY(1,1) NOT NULL,
    [PostTime] [datetime] NOT NULL,
    [DatabaseUser] [sysname] NOT NULL,
    [Event] [sysname] NOT NULL,
    [Schema] [sysname] NULL,
    [Object] [sysname] NULL,
    [TSQL] [nvarchar](max) NOT NULL,
    [XmlEvent] [xml] NOT NULL,
     CONSTRAINT [PK_TestDatabaseLog_DatabaseLogID] PRIMARY KEY NONCLUSTERED 
    (
    [DatabaseLogID] ASC
    )
    )
    ON ps_test(DatabaseLogId)
    GO/*
    5.插入数据
    */
    SET IDENTITY_INSERT dbo.TestDatabaseLog On
    INSERT INTO TestDatabaseLog
    SELECT * FROM DatabaseLogSET IDENTITY_INSERT TestDatabaseLog Off/*
    6.查看分区结果
    */
    select $partition.pf_test(DatabaseLogID) as 'partition number',
    COUNT(*) 'Rows in partition'
    from DATABASELOGBAK
    group by $partition.pf_test(DatabaseLogID);
    /*********************************************************************************************************************//*
    1.创建分区函数
    */
    create partition function OrderDateRangePFN(datetime)
    AS RANGE RIGHT
    FOR VALUES(N'2001-01-01 00:00:00',N'2002-01-01 00:00:00',N'2003-01-01 00:00:00',N'2004-01-01 00:00:00');/*
    2。创建分区scheme
    */
    create partition scheme OrderDatePScheme
    as partition OrderDateRangePFN
    TO([Primary],[Primary],[Primary],[Primary],[Primary])/*
    3.创建表
    */CREATE TABLE DBO.[SalesOrderHeader](
    [SalesOrderID] [int]  NULL,
    [RevisionNumber] [tinyint] NOT NULL,
    [OrderDate] [datetime] NOT NULL,
    [DueDate] [datetime] NOT NULL,
    [ShipDate] [datetime] NULL,
    [Status] [tinyint] NOT NULL
    ) ON  OrderDatePScheme (OrderDate)

    /* 旧表*/
    CREATE TABLE DBO.[SalesOrderHeaderOLD](
    [SalesOrderID] [int]  NULL,
    [RevisionNumber] [tinyint] NOT NULL,
    [OrderDate] [datetime] NOT NULL,
    [DueDate] [datetime] NOT NULL,
    [ShipDate] [datetime] NULL,
    [Status] [tinyint] NOT NULL
    ) /*
    4。插入数据
    */
    INSERT INTO dbo.SalesOrderHeader
    SELECT SalesOrderID,RevisionNumber,OrderDate,DueDate,ShipDate,Status  FROM Sales.SalesOrderHeaderCREATE CLUSTERED INDEX SalesOrderHeaderCLInd
    ON SalesOrderHeader(OrderDate) ON OrderDatePScheme(OrderDate)CREATE CLUSTERED INDEX SalesOrderHeaderOLDCLInd
    ON SalesOrderHeaderOLD(OrderDate)ALTER TABLE SalesOrderHeaderOLD WITH CHECK ADD CONSTRAINT
    ck_SalesOrderHeaderOLD_Orderdate check (
    orderdate >=('2003-01-01 00:00:00') and orderdate <=('2003-12-31 00:00:00'))
    /*
    5.查看分区结果
    */
    select $partition.OrderDateRangePFN(OrderDate) as 'partition number',
    MIN(OrderDate) as 'Min Order Date',
    MAX(OrderDate) as 'Max Order Date',
    COUNT(*) as 'Rows In Partition'
    From SalesOrderHeader
    group by $partition.OrderDateRangePFN(OrderDate);Select * From SalesOrderHeaderOLD
    delete from SalesOrderHeaderOLD
    /*
    6。切换分区内容到未分区的表
    */
    Alter table SalesOrderHeader
    switch partition 4 to salesOrderheaderOLDSelect * From SalesOrderHeaderOLD/*切换未分区的表内容到某个分区上*/
    alter table salesorderheaderold
    switch to salesorderheader partition 4
    --Select * From SalesOrderHeaderOLD/*
    7.合并分区范围
    */
    alter partition scheme orderdatepscheme next used [primary];
    alter partition function orderdaterangePFN() split range ('2003-01-01 00:00:00');
      

  2.   

    Tks FOR obuntu.
    我试试看。
      

  3.   

    主要问题是,分区函数中用到的字段类型,在TABLE都是唯一的,比如obuntu提供的这个例子里的 int datetime
    而我面临的是table里面都是定义的nvarchar类型。不知道是否可行
      

  4.   


    input_parameter_type 
    是用于分区的列的数据类型。当用作分区列时,除 text、ntext、image、xml、timestamp、varchar(max)、nvarchar(max)、varbinary(max)、别名数据类型或 CLR 用户定义数据类型外,所有数据类型均有效。
    联机丛书上的。
      

  5.   

    是用于分区的列的数据类型。当用作分区列时,除 text、ntext、image、xml、timestamp、varchar(max)、nvarchar(max)、varbinary(max)、别名数据类型或 CLR 用户定义数据类型外,所有数据类型均有效。
    --------------------------
    看来我的需求是没有解决方案了。