2012-03-24 2 views
1

У меня есть несколько родительских дочерних таблиц уровня (GrandParent, родительский и дочерний, все отношения много к одному, у одного родителя есть несколько детей, у всех детей один родитель). У каждого есть автоматические идентификационные ключи. Используя C# и хранимую процедуру, как вставлять их с ограничениями внешнего ключа? Например, вставляемые данные включают несколько внушительных родителей, каждый родитель града имеет несколько родителей и каждого родителя с несколькими дочерними элементами.Вставить в родительские-дочерние таблицы в SQL Server

Образец данных:

campus <- building <- office 

Добавление нескольких кампусов и связанных с ними зданий/офисов.

+0

В какой форме элементы, подлежащие вставке, существуют в вашей системе * до * до вставки? Как они связаны? Если бы был способ передать * все * элементы в одном вызове SP, могли бы вы передать свои ссылки (например, временные идентификаторы) вместе с именами и другими свойствами? –

ответ

3

Вы можете использовать функцию SCOPE_IDENTITY(), чтобы получить последнюю вставленную автоинкрементируемого ID:

DECLARE @new_parent_id INT 

INSERT INTO MyParent(...) VALUES(...) -- your new parent data 

SELECT @new_parent_id = SCOPE_IDENTITY() 

INSERT INTO MyChild(parent_id, ...) VALUES(@new_parent_id, ...) 

Это то, что вы имеете в виду ?

EDIT:

Вы действительно можете передать все ваши данные сразу с ADO.NET и SQL Server 2008 с использованием таблицы Ценится Параметры:

http://msdn.microsoft.com/en-us/library/bb675163.aspx

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

Это, вероятно, наиболее эффективное решение, потенциально требующее только одного вызова базы данных, и если у вас есть большой объем данных для вставки или если вы думаете, что можете повторно использовать этот СП в других местах вашего решения , то это может быть способ пойти.

Однако, я считаю, что вставка записей один за другим из клиентского приложения является более чистым и, безусловно, более простым способом достижения того, чего вы хотите.

+0

Если я вставляю несколько записей в MyParent, то у меня есть список идентификаторов, как мне привязать к правильным детям для каждого Id? – Icerman

+0

После каждой вставки вы можете использовать описанную выше технику для хранения сгенерированного идентификатора на C#, который затем можно вернуть обратно при вставке детей. –

+0

Имеют смысл. Но мне было интересно, могу ли я использовать udtt (s) для вставки всего набора в один sproc. – Icerman

1

Я думаю, что вам действительно нужно здесь database trigger. Вы не можете принудительно вводить пользовательскую логику, за исключением прямой ссылочной целостности таблицы в ограничении. Если вы хотите, чтобы пользовательская логика (должна иметь 2 родителя и т. Д.), Вам придется использовать триггер базы данных.

Вы можете сделать что-то вроде этого (псевдо-код):

BEFORE INSERT 
IF INSERT CAUSES MORE THAN 2 PARENTS 
    DO NOT ALLOW INSERT 
ELSE 
    ALLOW INSERT 
+0

Я обновил вопрос, чтобы уточнить мой вопрос. – Icerman

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