Trabalhando em algum SQL dinâmico para criar uma tabela particionada contínua de 13 meses. Veja aqui algumas informações básicas .
A parte do SQL dinâmico é bastante simples e a primeira partição é alternada sem problemas. Infelizmente, quando chego à segunda partição, começo a receber este erro:
Msg 4972, Level 16, State 1, Line 16
ALTER TABLE SWITCH statement failed. Check constraints or partition function of source table 'DBName.dbo.TableName_Partition2' allows values that are not allowed by check constraints or partition function on target table 'DBName.dbo.TableName'.
Tenho certeza de que é algo simples, mas não consigo entender. Aqui está o código.
-- Existing structure
USE [SourceDB]
GO
CREATE TABLE [dbo].[SourceTable](
[Col1] [bigint] NULL,
[Col2] [int] NULL,
[Col3] [int] NULL,
[Col4] [int] NULL,
[Col5] [int] NULL,
[Col6] [money] NULL,
[Modified] [datetime] NULL,
[ModifiedBy] [varchar](50) NULL,
[ModifiedType] [char](1) NULL
);
CREATE CLUSTERED INDEX [SourceTable_Modified] ON [dbo].[SourceTable]
( [Modified] ASC )
GO
USE [DestinationDB]
GO
CREATE PARTITION FUNCTION [ThirteenMonthPartFunction](datetime) AS
RANGE RIGHT FOR VALUES
( N'2015.08.01',
N'2015.09.01',
N'2015.10.01',
N'2015.11.01',
N'2015.12.01',
N'2016.01.01',
N'2016.02.01',
N'2016.03.01',
N'2016.04.01',
N'2016.05.01',
N'2016.06.01',
N'2016.07.01',
N'2016.08.01'
);
CREATE PARTITION SCHEME [ThirteenMonthPartScheme]
AS PARTITION [ThirteenMonthPartFunction] ALL TO ([PRIMARY]);
CREATE TABLE [dbo].[DestinationTable](
[Col1] [bigint] NULL,
[Col2] [int] NULL,
[Col3] [int] NULL,
[Col4] [int] NULL,
[Col5] [int] NULL,
[Col6] [money] NULL,
[Modified] [datetime] NULL,
[ModifiedBy] [varchar](50) NULL,
[ModifiedType] [char](1) NULL
) ON ThirteenMonthPartScheme (Modified);
GO
CREATE CLUSTERED INDEX [DestinationTable_Modified] ON [dbo].[DestinationTable]
(
[Modified] ASC
) ON ThirteenMonthPartScheme (Modified);
GO
SELECT *
INTO [TableName_Partition2]
FROM SourceDB.dbo.[SourceTable]
WHERE Modified >= N'2015.08.01'
AND Modified < N'2015.09.01';
GO
CREATE CLUSTERED INDEX [TableName_Modified]
ON [dbo].[TableName_Partition2] ([Modified] ASC);
GO
ALTER TABLE [dbo].[TableName_Partition2]
ADD CONSTRAINT [CK_TableName_Partition2]
CHECK ([Modified] >= N'2015.08.01'
AND [Modified] < N'2015.09.01');
GO
ALTER TABLE [TableName_Partition2]
SWITCH TO [DestinationTable] PARTITION 2;
GO
DROP TABLE TableName_Partition2;
GO
Eu tentei cada número de partição, tentei reduzir o intervalo de tempo para uma única data (ou seja, modificado = '2015.09.02'), mas ainda recebo o mesmo erro. Estou perplexo.
Obrigado por qualquer ajuda.
@wBob conseguiu em um. É tudo sobre esses NULLs.
O script a seguir cria a tabela Destination com uma
NOT NULL
coluna modificada e altera a mesma coluna em TableName_Partition2 para ficarNOT NULL
após a criação.Isso permite que o
SWITCH
seja executado.