• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 7768
  • Last Modified:

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
0
SamCash
Asked:
SamCash
  • 2
  • 2
1 Solution
 
Jim HornMicrosoft 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

Featured Post

How to Use the Help Bell

Need to boost the visibility of your question for solutions? Use the Experts Exchange Help Bell to confirm priority levels and contact subject-matter experts for question attention.  Check out this how-to article for more information.

  • 2
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now