将对象数组传递给SQL存储过程

本文关键字:SQL 存储过程 对象 数组 | 更新日期: 2023-09-27 18:13:27

我有两个表

  • payment(payment_id、其他成本、车库成本(
  • spareparts(payment_id、备件id、备件零件数量(

payment表中,payment_id是自动生成的。除了otherCostsgaragecosts值之外,在我的C#asp.net应用程序中还有一组具有的对象

{ sparepartId : 'Somevalue', sparePartQty : 'somevalue' }

我需要做的是在一个存储过程中,首先将记录与车库成本和其他成本值一起输入付款表。然后返回最后生成的支付ID,并将其作为数组中每个值对的paymentId输入到spareParts表中。

实现这一目标的方法是什么?请帮忙。

将对象数组传递给SQL存储过程

根据您的标签,我假设我们谈论的是SQLServer/T-SQL
您可以在一个存储过程中完成所有这些:

CREATE PROCEDURE dbo.Foo ... /* input parameters */
AS
BEGIN
    DECLARE @PaymentId int
    INSERT INTO payment(otherCosts, GarageCosts) VALUES (...)
    SET @PaymentId = SCOPE_IDENTITY()
    INSERT INTO spareparts(payment_id, sparepartId, sparePartQty) VALUES(@PaymentId, ...) 
END
GO

您可能还想了解@@IDENTITY,但一定要阅读有关@@IDENTITY和SCOPE_IDENTITY的信息,并了解与第一个相关的风险。

如果需要有两个独立的存储过程,也可以这样做,下面是第一个存储过程的样子。注意,@PaymentId是一个输出参数,这意味着调用者可以检索它并将它传递给第二个过程。

CREATE PROCEDURE dbo.Foo 
    /* input parameters */
    @PaymentId int OUT
AS
BEGIN
    INSERT INTO payment(otherCosts, GarageCosts) VALUES (...)
    SET @PaymentId = SCOPE_IDENTITY()
END
GO

编辑-澄清问题范围后:

如果需要调用第二个存储过程并向其传递一组参数,则可以使用SQL Server 2008或更新版本使用TVP(表值参数(。要了解如何在存储过程中使用它们,以及如何从C#代码传递它们,请参阅SQL Server 2008和.NET(C#(中的表值参数或表值参数
在只有一个存储过程的解决方案中,也可以使用TVP。

要解决您的问题,请尝试此

首先将您的数据与otherCostsGarageCosts一起插入到payment表中。

然后创建一个过程,从payment表中获取最新存储的payment_id

create procedure select_last_payment_id
as
begin
    select top 1 payment_id
    from payment
    order by payment_id desc  
end

最后,通过运行存储过程,将其分配给spareparts表的payment_id,并存储spareparts数据,得到payment_id

希望它对你有用。