2015-06-21 2 views
-1

У меня есть две таблицы Portfolio и Trades. После того, как данные портфеля были вставлены, используя этот идентификатор, я вставляю детали торгов в таблицу Trades.Вставить несколько родительских дочерних записей в SQL Server 2008 в хранимой процедуре

я получить несколько портфолио в одном запросе, например, если я получаю два портфеля P1 и P2, мне нужно вставить две записи в Portfolio таблицы и соответствующие прибыльных сделок детали в Trades таблицу один раз для каждого портфеля ,

Как передать все данные в одном вызове хранимой процедуры для поддержания транзакции?

+2

Пожалуйста, добавьте данные: Таблицы, данные, ожидаемые результаты и то, что вы сделали до сих пор –

+0

Таблица портфеля имеет идентификаторы столбцов, имя портфолио, CreatedBy и CreatedOn, а таблица Trades имеет столбцы PortfolioID (ссылка из таблицы Portfolio ID), тикер, количество акций, действие. Данные представляют собой P1, Vijay, 21-Jun-2015 –

+0

Таблица портфеля имеет идентификаторы столбцов, имя портфолио, createdBy и CreatedOn, а таблица Trades имеет столбцы PortfolioID (ссылка из идентификатора таблицы портфолио), тикер, количество акций, Действие. Портфолио 1: P1, Vijay, 21-Jun-2015 Торги для записей 1: 1, MSFT, 50, Купить \t; 1, IBM, 75, Sell. Портфолио Запись 2: P2, Suresh, 21-Jun-2015 Торги для записей 2: 2, YAHOO, 30, Update; 2, Goog, 40, Купить. В настоящее время я передаю две таблицы данных в хранимую процедуру для портфеля и одну для сделок и вызывая хранимую процедуру для каждого портфеля. –

ответ

2

Начиная с 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: Если ваш портфель идентификатор является столбцом идентификаторов, то при вставке данных в таблицу портфеля вам нужно будет использовать output положение, чтобы получить новые значения идентификаторов.

+0

В настоящее время я делаю так, как вы упомянули.Мое требование состоит в том, чтобы обрабатывать несколько портфолио одновременно. Я вызываю хранимую процедуру один раз для каждого портфолио. Есть ли способ передать все портфели за один раз. –

+0

Если вы используете параметр table value, вы можете заполнить его тем, сколько строк вы хотите ... в чем проблема? –

+0

Как вы будете поддерживать отношения в параметре таблицы, сопоставляемом между таблицей портфеля и торгов, если я передаю несколько портфелей и несколько сделок для каждого портфеля. Надеюсь, мой вопрос ясен. –

Смежные вопросы