SQL How do I INSERT INTO two tables at once and pass the ID from the first to the second

--
-- Two tables w two colums
-- Table "TestContacts", Colums "ContactID", "Name"
-- Table "TestAddress", Colums "ContactID", "Address"
-- Procedure to receive two params
--      INSERT INTO TestContacts.Name
--   ?get the ContactID of the inserted row
--  1. INSERT INTO TestAddress "ContactID, then INSERT INTO the TestAddress "Address" Where ContactID's match
--    or  
--  2. INSERT INTO TestAddress "the ContactID from TestContacts INSERT OPERATION above to ContactID" and "Address"
--    or??
-- result is to have ContactID in each table join(able) and get the right Name and Adress
--  
--         

CREATE PROCEDURE [dbo].[TestAddContact]
      (
      @Name nvarchar(50)
      ,@Address nvarchar (50)
      )
AS
BEGIN
      declare @IdentityValue int
      
INSERT INTO dbo.TestContacts ([Name])
OUTPUT INSERTED.ContactID INTO dbo.TestAddress([ContactID])
VALUES (@Name)

INSERT INTO dbo.TestAddress ([Address])
VALUES (@Address)
WHERE ContactID = INSERTED.ContactID
END
SamCashAsked:
Who is Participating?
 
Jim HornConnect With a Mentor Microsoft SQL Server Developer, Architect, and AuthorCommented:
Give this a whirl..
Declare @ContactID int 

-- Creating these tables for demo purposes only. 
CREATE TABLE TestContacts (ContactID int identity(1,1), Name varchar(100)) 
CREATE TABLE TestAddress (ContactID int, whatever varchar(100))

INSERT INTO TestContacts (Name) 
VALUES ('McPaddy O''Flavo') 

-- Grab the newly-created id
SET @ContactID = SCOPE_IDENTITY()

-- Now use it in another table
INSERT INTO TESTADDRESS(ContactID, whatever) 
VALUES (@ContactID, 'whatever')

SELECT * FROM TestContacts
SELECT * FROM TestAddress

Open in new window

1
 
Scott PletcherSenior DBACommented:
CREATE PROCEDURE [dbo].[TestAddContact]
       (
       @Name nvarchar(50)
       ,@Address nvarchar (50)
       )
AS
SET NOCOUNT ON
DECLARE @IdentityValue TABLE (
    ContactID int
    )
       
INSERT INTO dbo.TestContacts ([Name])
OUTPUT INSERTED.ContactID INTO @IdentityValue
VALUES (@Name)

INSERT INTO dbo.TestAddress ([ContactID], [Address])
SELECT ContactID, @Address
FROM @IdentityValue
0
 
SamCashAuthor Commented:
Thanks much!

Worked perfect.  I read that "SCOPE_IDENTITY()" could change if a trigger or function occurred, and "SCOPE_IDENTITY()" may not be reliable in threaded and parallel systems ... to use OUTPUT INSERTED.fieldname to be safe and allow for future if not using these now.

Thanks Again
0
 
SamCashAuthor Commented:
Thanks again for the simple solution.
0
 
Jim HornMicrosoft SQL Server Developer, Architect, and AuthorCommented:
I believe you are referring to @@IDENTITY, as I haven't experienced any issues with SCOPE_IDENTITY before.  But OUTPUT is guaranteed to return the inserted.ContactID.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.