Вставить в родительско-дочерние таблицы в SQL Server - PullRequest
1 голос
/ 24 марта 2012

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

Пример данных:

campus <- building <- office

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

Ответы [ 2 ]

3 голосов
/ 24 марта 2012

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

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, ...)

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

РЕДАКТИРОВАТЬ :

Вы действительно можете сразу передать все свои данные с помощью ADO.NET и SQL Server 2008, используя параметры с табличными значениями:

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

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

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

1 голос
/ 24 марта 2012

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

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

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