根据标识列插入然后更新 table 的存储过程

Stored procedures to insert and then update the table based on identity column

我有一个用例,我需要为审计创建 2 个存储过程(插入数据、更新记录)Table。

第一个 SP 将 12 列数据中的 6 列插入 table 并自动生成我需要的 ID return 并存储在 Azure 数据工厂的变量中,但由于某种原因我我无法获得该价值。我收到一条错误消息,指出存储过程没有 return 任何值,不确定我遗漏了什么。

在此之后,下一个管道将 运行 在 Azure 数据工厂中,一旦 运行 完成,我需要从数据工厂获取输出值并更新相同的 table在管道 运行.

之后生成的其余 6 条记录

下面是我的 table 架构

CREATE TABLE [gds].[TBL_SF_INTEGRATION_AUDIT](
[SF_Integration_Audit_ID] [int] IDENTITY(5000,1) NOT NULL,
[Integration_Batch_ID] [int] NULL,
[Pipeline_Run_StartDT] [datetime] NULL,
[Source_Schema] [varchar](1000) NOT NULL,
[Source_Object] [varchar](1000) NOT NULL,
[Target_Entity] [varchar](500) NOT NULL,
[Target_Load] [varchar](1000) NOT NULL,
[Source_Rows_Selected] [int] NULL,
[Batch_Count] [int] NULL,
[Successful_Batch_Count] [int] NULL,
[Failed_Batch_Count] [int] NULL,
[Successful_Inserted_Rows] [int] NULL,
[Failed_Rows] [int] NULL,
[Pipeline_Run_EndDT] [datetime] NULL

我创建了一个插入存储过程和一个更新存储过程。我正在使用 Scope_Identity() 来获取标识列的最新值,但我收到一条错误消息,指出存储过程没有 return 任何值。

ALTER PROCEDURE [dbo].[SP_Insert_Into_IntegrationAudit]
(
    -- Add the parameters for the stored procedure here 
    @Integration_Batch_ID int,
    @Pipeline_Run_StartDT datetime,
    @Source_Schema varchar(1000),
    @Source_Object varchar(1000), 
    @Target_Entity varchar(500), 
    @Target_Load varchar(1000),
    @SF_Integration_Audit_ID int out
)
AS
BEGIN

    -- Insert statements for procedure here
   INSERT INTO gds.TBL_SF_INTEGRATION_AUDIT
   (Integration_Batch_ID, Pipeline_Run_StartDT, Source_Schema, Source_Object,
   Target_Entity, Target_Load)
   VALUES (@Integration_Batch_ID, @Pipeline_Run_StartDT, @Source_Schema,
           @Source_Object, @Target_Entity, @Target_Load)

    SET @SF_Integration_Audit_ID = SCOPE_IDENTITY()
    RETURN @SF_Integration_Audit_ID 


END

对于更新 SP,我不确定如何传递来自第一个存储过程的 ID,以便 SQL 知道新数据应该位于 inserted/updated 的正确行?我已经按照建议更改了 SP 以进行更新。

ALTER PROCEDURE [dbo].[SP_Update_IntegrationAudit]
(
    -- Add the parameters for the stored procedure here
    @Source_Rows_Selected int,
    @Batch_Count int,
    @Successful_Batch_Count int,
    @Failed_Batch_Count int,
    @Successful_Inserted_Rows int, 
    @Failed_Rows int, 
    @Pipeline_Run_EndDT datetime,
    @SF_Integration_Audit_ID int
)

AS
BEGIN

    -- Insert statements for procedure here
   UPDATE gds.TBL_SF_INTEGRATION_AUDIT
   SET Source_Rows_Selected = @Source_Rows_Selected, 
    Batch_Count = @Batch_Count,
    Successful_Batch_Count = @Successful_Batch_Count,
    Failed_Batch_Count = @Failed_Batch_Count,
    Successful_Inserted_Rows = @Successful_Inserted_Rows, 
    Failed_Rows = @Failed_Rows, 
    Pipeline_Run_EndDT = @Pipeline_Run_EndDT
    WHERE SF_Integration_Audit_ID = @SF_Integration_Audit_ID

END
GO

任何帮助将不胜感激!谢谢!!

首先,绝对是的,scope_identity 是获取 Id 值的正确方法。

你说你正在存储从你的第一个过程调用返回的 Id 值(我假设该列被称为 Id 你没有提供 table 模式),所以您可以在您的第二个过程中包含一个参数 (@Id int),然后将它与您已经提供的其他值一起传递 - 您的评论表明您打算这样做?

然后在你的第二个过程中你只需

update gds.TBL_SF_INTEGRATION_AUDIT set
<columns=@values>
where id=@id

捕获 Identity 的另一种方法是使用 output 子句将 identity value 与其他相关值一起捕获到单独的 table.

您可以执行以下操作

insert into gds.TBL_SF_INTEGRATION_AUDIT (<columns>) 
output inserted.Id, inserted.Integration_Batch_Id into <another table> -- or any other columns needed
values (<values>)

然后您可以 join 使用已知值找到生成的 Id