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

How to insert Data into Two Tables in single Storedprocedure where primarykey in one Table is Foreignkey in another Table

Hi,

I am inserting data into two Tables in one stored procedure.TableA the primary key is ProductID.It is auto incrementing.It is foreing key in  TableB.
TableB the primarykey is ProductId and ProductDetailsID.ProductDetaildID is auto incrementing.I need to enter the max(productId) from TableA.
Can we do this in Single procedure.
How to do that.

CREATE PROCEDURE [dbo].[usp_InsertProduct]
(
  @Product_Desc varchar(100),
  @ProductName varchar(100),
  @ProductDetails varchar(200),
  @ProductPrice varchar(200),
   @StarDate datetime,
  @EndDate datetime,
  @AddedBy varchar(100),
  @AddedOn datetime,
  @ProductType  varchar(100)
)
As
Begin
     Insert Into [dbo].[t_TableA]
            (
              Product_Desc,
              ProductPrice,
              StartDate,
              EndDate,
              AddedBy,
              AddedOn
             
            )
            Values
            (
              @Product_Desc,
              @ProductPrice,
              @StartDate,
              @EndDate,
              @AddedBy,
              @AddedOn
           
            );                                                      
   INSERT INTO [dbo].[t_TableB]
               (
                                    ProductName,
                                    ProductDetails,
               StartDate,
                                    EndDate ,
                                    AddedBy,
                                    AddedOn
                                    )
                                 VALUES
               (
                                    @ProductName,
                                    @ProductDetails,
                @StartDate,
                                    @EndDate,
                                    @AddedBy,
                                    @AddedOn
                                    )
                               
         
       
           End
0
KavyaVS
Asked:
KavyaVS
  • 5
  • 5
4 Solutions
 
Scott PletcherSenior DBACommented:
You can use the SCOPE_IDENTITY() function to get the last identity value assigned in your code's scope, like so:



Declare @ProductId int

Insert Into [dbo].[t_TableA]
            (
              Product_Desc,
              ProductPrice,
              StartDate,
              EndDate,
              AddedBy,
              AddedOn
             
            )
            Values
            (
              @Product_Desc,
              @ProductPrice,
              @StartDate,
              @EndDate,
              @AddedBy,
              @AddedOn
           
            );                    

   SET @ProductId = SCOPE_IDENTITY()                                  

   INSERT INTO [dbo].[t_TableB]
               (
                                    ProductId,
                                    ProductName,
                                    ProductDetails,
                                    StartDate,
                                    EndDate ,
                                    AddedBy,
                                    AddedOn
                                    )
                                 VALUES
               (
                                    @ProductId,
                                    @ProductName,
                                    @ProductDetails,
                                    @StartDate,
                                    @EndDate,
                                    @AddedBy,
                                    @AddedOn
                                    )
0
 
KavyaVSAuthor Commented:
I tried the way you mentioned.I got Sql Exception.
Cannot insert the value NULL into column 'ProductID', table 'dbo.t_TableA'; column does not allow nulls. INSERT fails.

ProductID is not automatically incrementing.We need to set them explicitly.


Thanks.
0
 
Scott PletcherSenior DBACommented:
But in the original q you stated:

>> TableA the primary key is ProductID.It is auto incrementing. <<
0
Get your problem seen by more experts

Be seen. Boost your question’s priority for more expert views and faster solutions

 
KavyaVSAuthor Commented:
I thought it was.But not.It's giving the error.

Thanks
0
 
Scott PletcherSenior DBACommented:
Declare @ProductIds Table (
    ProductId int
    )
Declare @ProductId int


Insert Into [dbo].[t_TableA]
            (
              ProductId,
              Product_Desc,
              ProductPrice,
              StartDate,
              EndDate,
              AddedBy,
              AddedOn              
            )
            OUTPUT INSERTED.ProductId INTO @ProductIds ( ProductId )
            SELECT
               (SELECT ISNULL(MAX(ProductId), 0) FROM [dbo].[t_TableA]),
              @Product_Desc,
              @ProductPrice,
              @StartDate,
              @EndDate,
              @AddedBy,
              @AddedOn          
            ;                    

   SET @ProductId = (SELECT TOP (1) FROM @ProductIds);

   INSERT INTO [dbo].[t_TableB]
               (
                                    ProductId,
                                    ProductName,
                                    ProductDetails,
                                    StartDate,
                                    EndDate ,
                                    AddedBy,
                                    AddedOn
                                    )
                                 VALUES
               (
                                    @ProductId,
                                    @ProductName,
                                    @ProductDetails,
                                    @StartDate,
                                    @EndDate,
                                    @AddedBy,
                                    @AddedOn
                                    )
0
 
KavyaVSAuthor Commented:
I tried as it is you specified. I am  getting this error.
Cannot insert the value NULL into column 'ProductID', table 'dbo.t_TableB'; column does not allow nulls. INSERT fails.

Please let me know.

Thanks
0
 
Scott PletcherSenior DBACommented:
CORRECTION TO CODE FIRST:
...
OUTPUT INSERTED.ProductId INTO @ProductIds ( ProductId )
            SELECT
               (SELECT ISNULL(MAX(ProductId), 0) + 1 FROM [dbo].[t_TableA]),
              @Product_Desc,
...


Hmm, the ONLY way it should be NULL is if the INSERT on tableA failed.  Re-check the INSERT on tableA.
0
 
KavyaVSAuthor Commented:
I am getting the error here.
Incorrect syntax near the keyword 'FROM'.
SET @ProductId = (SELECT TOP (1) FROM @ProductIds);


Thanks.
0
 
Scott PletcherSenior DBACommented:
D'OH, quite right; sorry:


SET @ProductId = (SELECT TOP (1) ProductId FROM @ProductIds);
0
 
KavyaVSAuthor Commented:
Thanks
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.

Join & Write a Comment

Featured Post

Cloud Class® Course: CompTIA Cloud+

The CompTIA Cloud+ Basic training course will teach you about cloud concepts and models, data storage, networking, and network infrastructure.

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