根据标识列插入然后更新 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
。
我有一个用例,我需要为审计创建 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
。