Как я могу скопировать запись SQL, которая имеет связанные записи в других таблицах в ту же базу данных? - PullRequest
2 голосов
/ 30 апреля 2010

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

В любом случае, это прекрасно работает ... Вот описание того, как оно выполняет копию:

Заполняет двухстолбцовую таблицу поиска на основе памяти текущим первичным ключом каждой записи. Затем, когда он по отдельности создает каждую новую запись копии, он обновляет справочную таблицу с помощью Identity PK новой записи [получено из SCOPE_IDENTITY ()]. Теперь, когда он копирует любые связанные дочерние элементы, он может искать новый родительский PK, чтобы установить FK для новой записи.

При тестировании копирование реляционной структуры на локальный экземпляр SQL Server 2005 Express Edition заняло всего минуту. К сожалению, производство оказывается ужасно медленным! Мои пользователи имеют дело с более чем 60 000 записей на родительскую запись по локальной сети на наш SQL Server! Хотя моя функция копирования все еще работает, каждая из этих записей представляет отдельную команду SQL UPDATE, и она загружает SQL Server примерно на 17% ЦП по сравнению с его обычным 2% простоя. Я только что закончил тестирование 50 000 записей, и это заняло почти 20 минут!

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

(мы используем Microsoft SQL Server 2005 Standard Edition.)

Спасибо!

-Derek

Ответы [ 2 ]

1 голос
/ 30 апреля 2010

Да, если это SQL 2005, вы можете использовать хранимую процедуру CLR для установки своего кода C # в Db. Чтобы сделать это на чистом TSQL, достаточно просто утомительно и нужно использовать переменные для новых ключей. Является ли это только случаем одной родительской записи, а затем множества дочерних записей, которые находятся только в одной дочерней таблице? В этом случае вы могли бы избежать выдачи отдельных команд вставки для каждой дочерней строки, используя тот факт, что вы можете встроить оператор выбора в вставку, особенно если вы используете столбцы идентификаторов для PK. Обычно это будет НАМНОГО быстрее, если вы сможете это сделать. Примерно так (синтаксис может быть немного неправильным, но вам все равно придется адаптировать его к вашим реальным таблицам):

insert into tblchild select @newparentId, col1,col2 from tblChild where parentid=@oldparentid

Вот отправная точка для CLR в SQL Server ...

http://msdn.microsoft.com/en-us/library/ms131045.aspx (Эта статья является SQL 2008, но, вероятно, к ней применима большая часть).

http://www.sqlteam.com/article/writing-clr-stored-procedures-in-charp-introduction-to-charp-part-1

0 голосов
/ 30 апреля 2010

будет использовать (псевдокод)

INSERT INTO (PkField, FkField, OtherFields) SELECT NewPkValue, NewFkValue, OtherFields FROM TableName WHERE FkField = OldFkValue

справка для связанных дочерних таблиц в том, что они будут пакетными, а не отдельными обновлениями на запись?

...