No Problem adding PK to BKUP table. The duplicate check query you said to try, which I've already run myself on the original table and backup table, produces no results.
Here is the script (note: the DDL for the table creation is midway thru the script. You can copy and paste this to a new window to create the initial table. Just change to filegroup to PRIMARY.):
SET ANSI_NULLS ON;
SET QUOTED_IDENTIFIER ON;
SET ANSI_PADDING ON;
DECLARE
@TableName VARCHAR(128)
, @SQL VARCHAR(300)
-------------------------------------------------------------------------------
-- Backup the STUDENT_ATTENDANCE table to STUDENT_ATTENDANCE_BKUP
-------------------------------------------------------------------------------
USE zPartitionTest;
-- first let's make a backup of the student_attendance table
IF NOT EXISTS(select 1 from sys.tables where [name] = 'STUDENT_ATTENDANCE_BKUP')
BEGIN
PRINT 'Copying student_attendance table to student_attendance_bkup table';
SELECT * INTO STUDENT_ATTENDANCE_BKUP FROM STUDENT_ATTENDANCE;
END
IF NOT EXISTS(select 1 from sys.tables where [name] = 'STUDENT_ATTENDANCE_BKUP')
PRINT ' ***** Table copy failed; STUDENT_ATTENDANCE_BKUP does not exist. Script stopped. *****';
ELSE
BEGIN --bkup table exists.
IF EXISTS(select 1 from sys.tables where [name] = 'STUDENT_ATTENDANCE')
BEGIN
PRINT 'Dropping table STUDENT_ATTENDANCE';
DROP TABLE STUDENT_ATTENDANCE;
END
USE master;
-----------------------------------------------------------------------
-- Create new database filegroup, new data file in the new filegroup,
-- Partition Function and Partition Scheme...
-----------------------------------------------------------------------
IF EXISTS(select 1 from sys.master_files where [name] = 'zPartitionTest_ARCHIVE.NDF')
BEGIN
PRINT '...dropping the old data file, zPartitionTest_ARCHIVE.NDF.'
ALTER DATABASE zPartitionTest
REMOVE FILE zPartitionTest_ARCHIVE;
END
IF EXISTS(select 1 from sys.filegroups where [name] = 'DatabaseArchivePartition')
BEGIN
PRINT '...dropping the old filegroup, DatabaseArchivePartition.'
ALTER DATABASE zPartitionTest
REMOVE FILEGROUP DatabaseArchivePartition;
END
PRINT 'Adding filegroup DatabaseArchivePartition.'
ALTER DATABASE zPartitionTest
ADD FILEGROUP DatabaseArchivePartition; -- separate filegroup to hold the archive table partitions
PRINT 'Adding new data file, zPartitionTest_ARCHIVE.NDF, to the new archive partition filegroup.'
ALTER DATABASE zPartitionTest
ADD FILE
( NAME = zPartitionTest_ARCHIVE
,FILENAME = 'G:\data\SQLSERVER\zPartitionTest_ARCHIVE.NDF'
,SIZE = 1024 MB
,FILEGROWTH = 1024 MB
)
TO FILEGROUP DatabaseArchivePartition;
USE zPartitionTest;
IF EXISTS(select 1 from sys.partition_schemes where [name] = 'STUDENT_ATTENDANCE_PRTN_SCHM')
BEGIN
PRINT '...dropping Partition Scheme, STUDENT_ATTENDANCE_PRTN_SCHM'
DROP PARTITION SCHEME STUDENT_ATTENDANCE_PRTN_SCHM
END
IF EXISTS(select 1 from sys.partition_functions where [name] = 'STUDENT_ATTENDANCE_PRTN_FNCTN')
BEGIN
PRINT '...dropping Partition Function, STUDENT_ATTENDANCE_PRTN_FNCTN'
DROP PARTITION FUNCTION STUDENT_ATTENDANCE_PRTN_FNCTN
END
PRINT 'Creating the partition function, STUDENT_ATTENDANCE_PRTN_FNCTN, that will be used to split out the archive data from the student_attendance table.'
CREATE PARTITION FUNCTION STUDENT_ATTENDANCE_PRTN_FNCTN (DATETIME)
AS RANGE RIGHT FOR VALUES ('2013/08/01 00:00:00.000'); -- all data less than this date goes into the first partition (archive).
PRINT 'Creating the partition scheme, STUDENT_ATTENDANCE_PRTN_SCHM, to specify where the archive data will be stored.'
CREATE PARTITION SCHEME STUDENT_ATTENDANCE_PRTN_SCHM
AS PARTITION STUDENT_ATTENDANCE_PRTN_FNCTN
TO (DatabaseArchivePartition, [PRIMARY]); -- old data to archive, new data to primary.
PRINT 'Creating new STUDENT_ATTENDANCE table, specifying how to partition data.'
CREATE TABLE [dbo].[STUDENT_ATTENDANCE]
(
[ATT_OID] [nchar](14) NOT NULL
,[ATT_STD_OID] [nchar](14) NULL
,[ATT_SKL_OID] [nchar](14) NULL
,[ATT_DATE] [datetime] NOT NULL
,[ATT_CODE_VIEW] [varchar](50) NULL
,[ATT_TIME_VIEW] [varchar](40) NULL
,[ATT_ABSENT_IND] [char](1) NULL DEFAULT(0)
,[ATT_TARDY_IND] [char](1) NULL DEFAULT(0)
,[ATT_DISMISSED_IND] [char](1) NULL DEFAULT(0)
,[ATT_REASON_CODE] [varchar](20) NULL
,[ATT_EXCUSED_IND] [char](1) NULL DEFAULT(0)
,[ATT_PORTION_ABSENT] [numeric](8, 4) NULL
,[ATT_OTHER_CODE] [varchar](20) NULL
,[ATT_OTHER_CODE_02] [varchar](20) NULL
,[ATT_COMMENT] [varchar](max) NULL
,[ATT_TIMESTAMP] [numeric](14, 0) NULL
,[ATT_FIELDA_001] [varchar](10) NULL
,[ATT_FIELDA_002] [varchar](10) NULL
,[ATT_FIELDB_001] [varchar](25) NULL
,[ATT_LAST_MODIFIED] [numeric](14, 0) NULL
,[ATT_ABSENT_IND_02] [char](1) NULL DEFAULT(0)
,[ATT_TARDY_IND_02] [char](1) NULL DEFAULT(0)
,[ATT_DISMISSED_IND_02] [char](1) NULL DEFAULT(0)
,[ATT_REASON_CODE_02] [varchar](20) NULL
,[ATT_EXCUSED_IND_02] [char](1) NULL DEFAULT(0)
,[ATT_COMMENT_02] [varchar](max) NULL
,[ATT_RESPONSE] [varchar](max) NULL
,[ATT_RESPONSE_02] [varchar](max) NULL
)
ON STUDENT_ATTENDANCE_PRTN_SCHM(ATT_DATE); --partition on att_date
-- Check for clustered index and primary key
SELECT @TableName = ISNULL(o.[name], '')
FROM sys.indexes i
JOIN sys.objects o ON i.[object_id] = o.[object_id]
WHERE i.[name] = 'CX_STUDENT_ATTENDANCE_ATT_DATE' ;
IF @TableName <> ''
BEGIN
PRINT '...dropping the old CX_STUDENT_ATTENDANCE_ATT_DATE constraint'
SET @SQL = 'DROP INDEX CX_STUDENT_ATTENDANCE_ATT_DATE ON ' + @TableName
EXEC(@SQL);
END
PRINT 'Adding Clustered Index on ATT_DATE.'
CREATE CLUSTERED INDEX CX_STUDENT_ATTENDANCE_ATT_DATE
ON STUDENT_ATTENDANCE(ATT_DATE);
SELECT @TableName = ISNULL(o.[name], '')
FROM sys.indexes i
JOIN sys.objects o ON i.[object_id] = o.[object_id]
WHERE i.[name] = 'PK_STUDENT_ATTENDANCE_ATT_OID'
IF @TableName <> ''
BEGIN
PRINT '...dropping the old PK_STUDENT_ATTENDANCE_ATT_OID constraint'
SET @SQL = 'ALTER TABLE ' + @TableName + ' DROP CONSTRAINT PK_STUDENT_ATTENDANCE_ATT_OID'
EXEC(@SQL)
END
PRINT 'Adding non-clustered Primary Key on ATT_OID'
ALTER TABLE [dbo].STUDENT_ATTENDANCE_BKUP
ADD CONSTRAINT PK_STUDENT_ATTENDANCE_BKUP_ATT_OID PRIMARY KEY NONCLUSTERED (ATT_OID)
ON [PRIMARY];
PRINT 'Copying data from Staging table into the new partitioned STUDENT_ATTENDANCE table.' + CHAR(13);
INSERT INTO STUDENT_ATTENDANCE SELECT * FROM STUDENT_ATTENDANCE_BKUP; --PRIMARY KEY VIOLATION ERROR
--check partition counts
SELECT * FROM sys.partitions WHERE OBJECT_NAME(OBJECT_ID)='STUDENT_ATTENDANCE';
SELECT $PARTITION.STUDENT_ATTENDANCE_PRTN_FNCTN(ATT_DATE) AS PARTITIONID,
COUNT(* ) AS ROW_COUNT
FROM DBO.STUDENT_ATTENDANCE
GROUP BY $PARTITION.STUDENT_ATTENDANCE_PRTN_FNCTN(ATT_DATE)
ORDER BY PARTITIONID;
END --bkup table exists.
SET ANSI_PADDING OFF;