在存储过程中插入多个父子记录到SQL Server 2008中

问题描述:

我有两个表PortfolioTrades。插入投资组合数据后,使用该ID,我将交易详细信息插入Trades表中。在存储过程中插入多个父子记录到SQL Server 2008中

我会得到多个组合在一个单一的请求,例如,如果我得到两个组合P1和P2,我需要为每一个投资组合将两个记录到Portfolio表,以及相应的交易细节到Trades表一次。

如何在单个存储过程调用中传递整个数据以维护事务?

+2

请添加详细信息:表格,数据,预期结果以及迄今为止所做的工作 –

+0

组合表具有列ID,组合名称,CreatedBy和CreatedOn,并且交易表具有列组合ID(参考组合表) ID),股票代码,股票数量,行动。数据是P1,Vijay,2015年6月21日 –

+0

投资组合表具有列ID,投资组合名称,CreatedBy和CreatedOn,并且交易表具有列投资组合ID(从投资组合表ID引用),股票代码,股数,行动。投资组合记录1:Vijay,2015年6月21日交易记录1:1,MSFT,50,买入\t; 1,IBM,75,卖。投资组合记录2:P2,Suresh,2015年6月21日交易记录2:2,YAHOO,30,更新; 2,Goog,40,买。目前,我将两个数据表传递给存储过程一个用于投资组合,一个用于交易,并为每个投资组合调用存储过程。 –

从sql server 2008开始,您可以使用table valued parameter s将单个调用中的表结构化数据传递给存储过程。
但是,并不是每个客户端都支持这一点。例如,使用.Net很容易,但是我怀疑VBScript是可行的。

为了使用一个表值参数,你必须首先创建一个用户定义的表类型:

CREATE TYPE UDT_Portfolio As Table 
(
    Portfolio_Id int, 
    Portfolio_Name varchar(10), 
    ..... 
) 
你的情况

,因为你想通过2个表,就需要2种类型:

CREATE TYPE UDT_Trades As Table 
(
    Trade_Id int, 
    Trade_Portfolio_Id int, 
    Trade_Name varchar(10), 
    .... 
) 

现在,在存储过程中使用起来非常简单:

CREATE PROCEDURE stp_InsertPortfoliosAndTrades 
(
    @Portfolio UDT_Portfolio readonly, -- Note: Readonly is a must 
    @Trade UDT_Trades readonly 
) 
AS 

-- stored procedure logic here 

注#1::表值参数是只读的。这意味着你不能在它们上使用更新,插入或删除语句。 但是,您可以在存储过程内声明值为的变量,并在其上使用插入,更新和删除。

注2:如果你的投资组合ID是标识列,然后将数据插入到表中的投资组合时,您将需要使用output子句,以获得新的ID值。

+0

目前,我正在按照您提到的方式进行操作。我的要求是同时处理多个投资组合。我为每个组合调用一次存储过程。有没有办法在一次通话中通过所有投资组合。 –

+0

如果您使用的是表值参数,您可以填写您想要的行数......问题是什么? –

+0

如果我为每个投资组合通过多个投资组合和多个交易,您将如何维持投资组合和交易表之间的表值参数之间的关系。希望我的问题很明确。 –