将对象数组传递给SQL存储过程
本文关键字:SQL 存储过程 对象 数组 | 更新日期: 2023-09-27 18:13:27
我有两个表
payment
(payment_id、其他成本、车库成本(spareparts
(payment_id、备件id、备件零件数量(
在payment
表中,payment_id
是自动生成的。除了otherCosts
和garagecosts
值之外,在我的C#asp.net应用程序中还有一组具有的对象
{ sparepartId : 'Somevalue', sparePartQty : 'somevalue' }
我需要做的是在一个存储过程中,首先将记录与车库成本和其他成本值一起输入付款表。然后返回最后生成的支付ID,并将其作为数组中每个值对的paymentId
输入到spareParts
表中。
实现这一目标的方法是什么?请帮忙。
根据您的标签,我假设我们谈论的是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。
要解决您的问题,请尝试此
首先将您的数据与otherCosts
和GarageCosts
一起插入到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
。
希望它对你有用。