As I was writing the series on myths around IDENTITY columns, I started to wonder whether copying a table into another using the SELECT…INTO statement copies over the IDENTITY property also.
The simplest way to answer this question was to run a simple test, which is shown below:
- Create a table with an IDENTITY column defined, and insert some test data
- Use SELECT…INTO to select data from the source table and pump it into another table
- For clarity, I will be using different column names between the source and the destination columns
- Use the catalog views – sys.columns and sys.identity_columns to confirm whether the new table was created with the IDENTITY column in place or not
USE tempdb;
GO
SET NOCOUNT ON;
--1. Prepare the environment
-- Create a table, and add some test data into it
--Safety Check
IF OBJECT_ID('tIdentity','U') IS NOT NULL
DROP TABLE dbo.tIdentity;
GO
--Create a table
CREATE TABLE dbo.tIdentity (IdentityId INT IDENTITY(1,1),
IdentityValue VARCHAR(10)
);
GO
--Add some test data
INSERT INTO dbo.tIdentity (IdentityValue)
VALUES ('One'),
('Two'),
('Three');
GO
--2. Use SELECT..INTO to bulk insert data to a new table
SELECT SourceTable.IdentityId AS DestinationId,
SourceTable.IdentityValue AS DestinationValue
INTO dbo.DestinationTable
FROM dbo.tIdentity AS SourceTable
--3. Check the properties of the new column - is it an IDENTITY column?
SELECT sc.name AS ColumnName,
OBJECT_NAME(sc.object_id) AS TableName,
sic.seed_value AS IdentitySeed,
sic.increment_value AS IdentityIncrement,
sic.is_nullable AS IsNullable,
sic.last_value AS LastIdentityValueUsed
FROM sys.columns AS sc
INNER JOIN sys.identity_columns AS sic ON sc.object_id = sic.object_id
AND sc.column_id = sic.column_id
WHERE ( sc.object_id = OBJECT_ID(N'dbo.DestinationTable',N'U') OR
sc.object_id = OBJECT_ID(N'dbo.tIdentity',N'U')
)
AND sc.is_identity = 1;
--4. Cleanup
IF OBJECT_ID('dbo.tIdentity','U') IS NOT NULL
DROP TABLE dbo.tIdentity;
GO
IF OBJECT_ID('dbo.DestinationTable','U') IS NOT NULL
DROP TABLE dbo.DestinationTable;
GO
/**********************************************
RESULTS
**********************************************/
/*
ColumnName TableName IdentitySeed IdentityIncrement IsNullable LastIdentityValueUsed
-------------- ----------------- ------------ ----------------- ---------- ---------------------
IdentityId tIdentity 1 1 0 3
DestinationId DestinationTable 1 1 0 3
*/
As can be seen from the experiment, the IDENTITY property propagates from one table to another via the SELECT…INTO clause.
Until we meet next time,


Title does not match with post.
May be you missed word “Myths”
LikeLike
@harsh: I stand corrected. The title has been updated. Thank-you!
LikeLike
Pingback: #0390 – SQL Server – SSIS – OLE DB Destination – Table Fast Load – Keep Identity option | SQLTwins by Nakul Vachhrajani