如何在另一个插入存储过程中调用插入存储过程并获取其返回的ID?

时间:2016-08-27 23:26:20

标签: sql sql-server

如果我的问题没有意义,我道歉。

所以我采用了一个使用GUID作为PK的数据库表,我已经规范化了这个数据库,并开始将现有数据库中的数据合并到新结构化的数据库中。 我有一个看起来像这样的原始表

create table #tmpMaterial
(
    ID int identity(1,1),
    MaterialID nvarchar(128),
    MaterialCategoryID nvarchar(128),
    MaterialTypeID nvarchar(128),
    MaterialSubTypeID nvarchar(128),
    MaterialDetail nvarchar(20),
    Description nvarchar(100),
    MaterialWidth numeric(10,2),
    MaterialLength int,
    MaterialSize nvarchar(20),
    PurchUnitOfMeasureID nvarchar(128),
    PurchaseItemQuantity int,
    SellUnitOfMeasureID nvarchar(128),
    SellItemQuantity int,
    NewPrice money,
    RemodPrice money,
    ServicePrice money,
    DefVendorID nvarchar(128),
    EnabledInd tinyint
)

并且插入数据是

insert into #tmpMaterial
select tmpM.MaterialID, tmpM.MaterialCategoryID,tmpM.MaterialTypeID, tmpM.MaterialSubTypeID, tmpM.MaterialDetail, tmpM.Description, tmpM.MaterialWidth, tmpM.MaterialLength, tmpM.MaterialSize,
tmpM.PurchUnitOfMeasureID, tmpM.PurchItemQuantity, tmpM.SellUnitOfMeasureID, tmpM.SellItemQuantity, tmpM.NewPrice, tmpM.RemodPrice, tmpM.ServicePrice, tmpM.DefVendorID, tmpM.EnabledInd
from Exovations.dbo.Material tmpM

因此,这会将原始数据插入到临时表中,这个临时表就是我要查询的内容。 我有一个临时表,它是新创建的表,它是

create table #tmpMaterialFinal
(
    ID int identity(1,1),
    MaterialCategoryID int,
    MaterialTypeID int,
    MaterialSubTypeID int,
    CompanyID int,
    DimensionsID int,
    PurchaseUOMID int,
    SellUOMID int,
    VendorID int,
    MaterialDetail nvarchar(20),
    Description nvarchar(100),
    PurchaseItemQuantity int,
    NewPrice money,
    RemodelPrice money,
    ServicePrice money,
    IsActive bit
)

我正在查询#tmpMaterial表并在进程中进行一些连接以将该数据导入#tmpMaterialFinal表。如果你看一下#tmpMaterial表我有这三个列

MaterialWidth numeric(10,2),
MaterialLength int,
MaterialSize nvarchar(20)

在我的#tmpMaterialFinal中我有DimensionsID,它是自己的名为Dimensions的表,在Dimensions表中我有3列,一列用于宽度,长度和大小。

我需要做的是在将记录插入#tmpMaterialFinal表时,我需要调用一个名为usp_InsertDimensions的存储过程,并从#tmpMaterial表中传递这三个值,并在插入#tmpMaterialFinal表时,我需要执行usp_InsertDimensions存储过程并获取其返回的ID,以便我可以将该ID放入DimensionsID列。

我的usp_InsertDimensions看起来像这样

CREATE PROCEDURE [dbo].[usp_InsertDimensions]
(
    @DimensionID int output,
    @DLength decimal(15,4),
    @DWidth decimal(15,4),
    @DHeight decimal(15,4)
)
AS
SET NOCOUNT OFF
SET TRANSACTION ISOLATION LEVEL READ COMMITTED

DECLARE @ERROR_SEVERITY int,
        @MESSAGE varchar(1000),
        @ERROR_NUMBER int,
        @ERROR_PROCEDURE nvarchar(200),
        @ERROR_LINE int,
        @ERROR_MESSAGE nvarchar(4000);

begin try
     insert into [Dimensions]
     (DLength, DWidth, DHeight)
     values
     (@DLength, @DWidth, @DHeight)
     set @DimensionID = SCOPE_IDENTITY()
end try
BEGIN CATCH
    SET @ERROR_SEVERITY = ISNULL(ERROR_SEVERITY(),'');
    SET @ERROR_NUMBER = ISNULL(ERROR_NUMBER(),'');
    SET @ERROR_PROCEDURE = ISNULL(ERROR_PROCEDURE(),''); 
    SET @ERROR_LINE = ISNULL(ERROR_LINE(),'');
    SET @ERROR_MESSAGE = ISNULL(ERROR_MESSAGE(),'');

    -- Test if the transaction is uncommittable.
    IF (XACT_STATE()) = -1
        BEGIN
            --PRINT N'The transaction is in an uncommittable state. Rolling back transaction.'
            ROLLBACK TRANSACTION;
        END;

    -- Test if the transaction is active and valid.
    IF (XACT_STATE()) = 1
        BEGIN
            --PRINT N'The transaction is committable. Committing transaction.'
            COMMIT TRANSACTION;   
        END;

    SET @MESSAGE = 'Error Occured in Stored Procedure ' + cast(@ERROR_PROCEDURE as varchar(200)) + 
                    '; Line Number ' + cast(@ERROR_LINE as varchar) + 
                    '; Message: [' + cast(@ERROR_NUMBER as varchar) + '] - '
                    + cast(@ERROR_MESSAGE as varchar(255))

    RAISERROR(@MESSAGE, @ERROR_SEVERITY, 1);
END CATCH;

关于正确实现这一目标的任何想法?

1 个答案:

答案 0 :(得分:0)

以下是您可以使用的一种方法:

  1. 在您的第一个表DimensionId
  2. 上添加#tmpMaterial字段
  3. 生成sql语句以将维度插入Dimensions表并将DimensionId存储回#tmpMaterial表。这样的东西应该可以工作(暂时没有MSSQL可以测试):

    select 'declare @d_id int; exec usp_InsertDimensions @d_id output, ' + cast(MaterialLength as varchar(100)) + ', ' + cast(MaterialWidth as varchar(100)) + ', ' + cast(MaterialSize as varchar(100)) + '; Update #tmpMaterial set DimensionId = @d_id where ID = ' + cast(ID as varchar(100)) + '; go;' from #tmpMaterial

  4. 这将为您提供插入维度并将其ID存储回源表所需的所有语句。您还可以在变量中连接所有这些语句,然后将它们作为动态sql执行,或者将语句存储在临时表中并批量执行。

    从现在开始,插入决赛桌将很简单。