Implementing IDENTITY in a Memory-Optimized Table
Topic Status: Some information in this topic is pre-release and subject to change in future releases. Pre-release information describes new features or changes to existing features in Microsoft SQL Server 2014.
IDENTITY columns are not supported for memory-optimized tables. IDENTITY columns are supported for table types. The workaround for IDENTITY values uses the SEQUENCE object (Sequence Numbers).
First remove the IDENTITY property from the table you are converting to In-Memory OLTP. Then, define a new SEQUENCE object for the column in the table. SEQUENCE objects as identity columns rely on the ability to create DEFAULT values for columns that use the NEXT VALUE FOR syntax to get a new identity value. Since DEFAULTs are not supported in In-Memory OLTP, you need to pass the newly-generated SEQUENCE value either to the INSERT statement or to a natively compiled stored procedure that does the insert. The following example demonstrates this pattern.
-- Create a new In-Memory OLTP table to simulate IDENTITY insert -- Here the column C1 was the identity column in the original table -- create table T1 ( [c1] integer not null primary key T1_c1 nonclustered hash with (bucket_count = 1024), [c2] varchar(32) not null, [c3] datetime not null ) with (memory_optimized = on) go -- This is a sequence provider that will give us values for column [c1] -- create sequence usq_SequenceForT1 as integer start with 1 increment by 1 go -- insert a sample row using the sequence -- note that a new value needs to be retrieved form -- the sequence object for every insert -- declare @c1 integer = next value for [dbo].[usq_SequenceForT1] insert into T1 values (@c1, 'test', getdate())
After performing the insert several times, you see valid monotonically increasing values in column [c1]. This result set is generated using table scan and hash index without ORDER BY so the rows are not ordered.