?
Solved

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

Posted on 2015-02-20
5
Medium Priority
?
6,338 Views
Last Modified: 2015-02-20
--
-- 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
Comment
Question by:SamCash
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
  • 2
5 Comments
 
LVL 66

Accepted Solution

by:
Jim Horn earned 2000 total points
ID: 40622073
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
 
LVL 69

Expert Comment

by:Scott Pletcher
ID: 40622075
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
 

Author Comment

by:SamCash
ID: 40622156
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
 

Author Closing Comment

by:SamCash
ID: 40622158
Thanks again for the simple solution.
0
 
LVL 66

Expert Comment

by:Jim Horn
ID: 40622166
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

U.S. Department of Agriculture and Acronis Access

With the new era of mobile computing, smartphones and tablets, wireless communications and cloud services, the USDA sought to take advantage of a mobilized workforce and the blurring lines between personal and corporate computing resources.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Use this article to create a batch file to backup a Microsoft SQL Server database to a Windows folder.  The folder can be on the local hard drive or on a network share.  This batch file will query the SQL server to get the current date & time and wi…
In this article we will get to know that how can we recover deleted data if it happens accidently. We really can recover deleted rows if we know the time when data is deleted by using the transaction log.
Visualize your data even better in Access queries. Given a date and a value, this lesson shows how to compare that value with the previous value, calculate the difference, and display a circle if the value is the same, an up triangle if it increased…
In this video, Percona Solutions Engineer Barrett Chambers discusses some of the basic syntax differences between MySQL and MongoDB. To learn more check out our webinar on MongoDB administration for MySQL DBA: https://www.percona.com/resources/we…

762 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question