0

Мне нужно передать коллекцию .NET в хранимую процедуру. Моя коллекция содержит 1000 записей. Каждая запись содержит 2-3 дочерних объекта других типов.Как передать библиотеку .NET Collection объектов (родительский ребенок) в хранимую процедуру SQL Server

Все, что мне нужно, чтобы вставить их сразу, вызвав хранимую процедуру из .NET.

Я уже пробовал TVP (параметр table-valued), но это просто не удовлетворяет мои потребности.

Для каждой записи уровня корня мне нужно вызвать хранимую процедуру, передав корневую запись и соответствующие дочерние записи. Это делает весь процесс очень медленным.

Именно поэтому я ищу способ, чтобы я мог передавать полный иерархический список одновременно и внутри хранимой процедуры, путем циклического и итерационного дочерних записей, я могу вставить родительские дочерние записи.

Как я могу это достичь?

+0

Попробуйте используйте XML и распакуйте его в таблицу temp в хранимой процедуре. Это работает довольно быстро для меня. –

+0

Табличные параметры - отличный способ сделать это. Просто передайте 2 таблицы, один для родительского другого для ребенка, сразу и некоторый ключ, чтобы связать их. – Alejandro

+0

@Alejandro: В настоящее время я проходил почти так же. Но, скорее, передача всего родителя как одной таблицы и целых детей как другого, я передаю одну родительскую запись вместе с ее соответствующим списком детей. Но это очень медленно, потому что мне нужно вставить родительскую запись 100K. Кроме того, для каждого отдельного родителя связано с ним 3-4 ребенка. – Usman

ответ

3

Я на самом деле просто сделал это 3 недели назад.

  1. создать «временный» ключ ассоциации (я использовал GUID), чтобы связать родителей и детей вместе, потому что у вас нет идентификаторов базы данных (ключ температура не сохраняется в базе данных)
  2. Обратиться в Хранимая процедура TVP. Передайте всех родителей и всех детей в две отдельные таблицы vars
  3. создать временную таблицу или таблицу var для хранения отношения tempid/database
  4. Используйте оператор слияния с OUTPUT, чтобы получить значение Inserted.Id и темп идентификатор в временную таблицу, созданную на шаге 3
  5. использовать КТР и слейте заявление, чтобы вставить дочерние записи, используя фактические БД идентификаторов из родительской записи

Вот несколько ссылок о процессе с «реальные» примеры:

merge parent and child SQL Server tables

T-SQL - Insert Data into Parent and Child Tables

+0

Keith: Не могли бы вы просто дать мне знать, как передать иерархический список Parent-Child из .NET для хранимой процедуры? Я не хочу разбивать иерархию родительских дочерних элементов при передаче всего списка. Потому что позже было бы сложно связать каждого ребенка с соответствующим родительским объектом. – Usman

+0

Я написал образцы кода в своем ответе (вторая ссылка в этом), но только для части sql. Вам нужен образец .net? –

+0

Да, если бы вы могли справиться с подробным ответом, было бы очень приятно :-) – Usman

0

Вы можете использовать XML для передачи записей, а также их детей к хранимой процедуре. Например

DECLARE @xml XML = '<root> 
<parent value="213"> 
    <child childValue="1111"></child> 
    <child childValue="1112"></child> 
</parent> 
<parent value="2313"> 
    <child childValue="3333"></child> 
    <child childValue="3332"></child> 
</parent> 
</root>' 

Затем вы можете сделать много способов, один из них денормализовать записи и сохранить временную таблицу для дальнейшей обработки

SELECT 
    T.c.value('parent::*/@value', 'INT') AS ParentValue, 
    T.c.value('@childValue', 'INT') AS ChildValue 
    FROM @xml.nodes('/root[1]/parent/child') T(c) 

Результат будет выглядеть

ParentValue ChildValue 
    213   1111 
    213   1112 
    2313   3332 
    2313   3333 
+0

Извините, но я не могу использовать XML вообще. Это дополнительно над головой в приложении. Я работаю со 100K записями за один раз, а построение в памяти xml с одиночными родительскими записями, состоящими из 80 столбцов, содержащих 10 столбцов, было бы очень плохой идеей. – Usman