Home | About | Resources | Contact | Partners
MUST Logo

Layout for printing

Download Free MUST Trial Today



"MUST allows our business to use Access to flexibly RAD our systems and then easily move production systems to SQL Server"
Karen Spencer, Partner and Business Manager,
Gravitas IT solutions

"FANTASTIC! What was going to take me hours hand (re)coding Stored Procs just worked..."
David Peach, I.T. Management & Support Services,
Qbt Consulting

"It has saved me a lot of time"
Julian Baker,
The Access Man



Converting Access Append Queries and IDENTITY_INSERT Problems

This article describes a problem that will occur when converting an append query to a SQL Server stored procedure, where the query appends directly into a column which has an identity property (autonumber).

We start with an Access database containing two tables, one with data and the other empty.



In each table the primary key is SQLVersionID and is an autonumber.

Now consider the following standard append query.



Once we have upsized and converted the application, we have a stored procedure in SQL Server replacing the append query.

CREATE PROCEDURE [dbo].[CopyDrivers_To_TempDrivers]
AS
BEGIN
INSERT INTO [TEMPDrivers] ( [SQLVersionID], [SQLVersion],
[ODBCDriverName], [OLEDBDriverName] )
SELECT [tblDrivers].[SQLVersionID],
[tblDrivers].[SQLVersion],
[tblDrivers].[ODBCDriverName],
[tblDrivers].[OLEDBDriverName]
FROM [tblDrivers]
End
GO

And a pass-through query in Access that fires the stored procedure.



The pass-through query contains the following SQL calling the stored procedure.



However when we execute the stored procedure from the management studio, or execute the pass-through query, you will get the following error.



Cannot insert explicit value for identity column in table....when IDENTITY_INSERT is set to OFF.

This happens because SQL Server demands that you state when you want to do an insert into an identity column, and you must also state when you are finished doing this (otherwise you will get errors when you try it on another table, whilst the same connection is active).

SET IDENTITY_INSERT [TEMPDRIVERS] ON

SET IDENTITY_INSERT [TEMPDRIVERS] OFF

The simplest solution is to modify the stored procedure as follows: -

ALTER PROCEDURE [dbo].[CopyDrivers_To_TempDrivers]
AS
BEGIN
SET IDENTITY_INSERT [TEMPDRIVERS] ON

INSERT INTO [TEMPDrivers] ( [SQLVersionID], [SQLVersion],
[ODBCDriverName], [OLEDBDriverName] )
SELECT [tblDrivers].[SQLVersionID],
[tblDrivers].[SQLVersion],
[tblDrivers].[ODBCDriverName],
[tblDrivers].[OLEDBDriverName]
FROM [tblDrivers]

SET IDENTITY_INSERT [TEMPDRIVERS] OFF
End
GO

The executing either the pass-through query, or the stored proecdure directly in the management studio will work.

Top of Page

MUST+SQL automatically removes problems with cascades in relationships removing any cascade operations but leaving the relationships active. Click below to improve your development productivity.



Top of Page