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,
