• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 255
  • 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
Configuration Guide and Best Practices

Read the guide to learn how to orchestrate Data ONTAP, create application-consistent backups and enable fast recovery from NetApp storage snapshots. Version 9.5 also contains performance and scalability enhancements to meet the needs of the largest enterprise environments.

 
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

Featured Post

Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

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