Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 SQL Server 2005 и рекурсивный запрос на вставку  [new]
Mr.Hitman_47
Member

Откуда: Константиновка
Сообщений: 6
Здравствуйте все. У меня есть база в Access но я хочу ее перевести в SQL Server 2005 все получается но в проге (клиенте) которая работает с базой есть процедура копирования (эта процедура копирует дерево или ветку) там она работает навигационным способом что не очень хорошо как можно скопировать дерево(ветку) при помощи SQL, загвоздка в том что при копировании новые(скопированые) узлы должны перераспределить связи типа Id>ParentId, id будут новые (при копировании) соотведственно ParentId тоже должны обновится
7 июл 11, 16:59    [10940514]     Ответить | Цитировать Сообщить модератору
 Re: SQL Server 2005 и рекурсивный запрос на вставку  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
И в чем проблема?
7 июл 11, 17:01    [10940527]     Ответить | Цитировать Сообщить модератору
 Re: SQL Server 2005 и рекурсивный запрос на вставку  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
В целевой таьлице сделать дополнительное поле со старым id.
в триггере AFTER INSERT проапдейтить ParentId.
7 июл 11, 17:04    [10940563]     Ответить | Цитировать Сообщить модератору
 Re: SQL Server 2005 и рекурсивный запрос на вставку  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
iap
В целевой таьлице сделать дополнительное поле со старым id.
в триггере AFTER INSERT проапдейтить ParentId.
Или в процедуре или в скрипте, если эта акция одноразовая
7 июл 11, 17:12    [10940630]     Ответить | Цитировать Сообщить модератору
 Re: SQL Server 2005 и рекурсивный запрос на вставку  [new]
Mr.Hitman_47
Member

Откуда: Константиновка
Сообщений: 6
в триггере можно обрабатывать каждую запись в запросе, можно по подробнее
7 июл 11, 17:50    [10940905]     Ответить | Цитировать Сообщить модератору
 Re: SQL Server 2005 и рекурсивный запрос на вставку  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Mr.Hitman_47
в триггере можно обрабатывать каждую запись в запросе, можно по подробнее
Обрабатывать надо не одну, а все записи сразу.
Вот в чём фокус-то!

Впрочем, если это, всё-таки, разовая операция, то можно вставлять и построчно.
Например, в цикле по курсору. Курсор - на базе рекурсивного CTE.
Триггер тогда не нужен. И вспомогательное поле для старого id тоже.
Нужна будет функция SCOPE_IDENTITY() и т.п.
7 июл 11, 20:11    [10941545]     Ответить | Цитировать Сообщить модератору
 Re: SQL Server 2005 и рекурсивный запрос на вставку  [new]
Mr.Hitman_47
Member

Откуда: Константиновка
Сообщений: 6
WITH
tree (TreeId, TreeParentId)
AS (SELECT Id,
ParentId
FROM tesh_spec
WHERE id = 106
UNION ALL
SELECT Id,
ParentId
FROM tesh_spec V
INNER JOIN tree t
ON t.TreeId = V.ParentId)
INSERT INTO tesh_spec(ParentId, idContract, idChildren, idName, iCount, idMaterial, fWeight, idProfile, fNorm, iM1, iM2, iM3, iM4, iM5, iM6, iM7, fT1, fT2, fT3, fT4, fT5, fT6, fT7,
fT9, fT8, fT10, fT11, fT12, fT13, fMKTP, idDetal, iColor, InMapWeighingMetal, IsDeleted, idChildrenEx)
SELECT ParentId, idContract, idChildren, idName, iCount, idMaterial, fWeight, idProfile, fNorm, iM1, iM2, iM3, iM4, iM5, iM6, iM7, fT1, fT2, fT3, fT4, fT5, fT6, fT7,
fT9, fT8, fT10, fT11, fT12, fT13, fMKTP, idDetal, iColor, InMapWeighingMetal, IsDeleted, idChildrenEx
FROM tree, tesh_spec
WHERE tree.TreeId = Id
вот запрос копирует узел, копался копался но так и не понял как зделать чтобы Parentid пересчитывался под новые записи, сам не разберусь очень нада помощь
8 июл 11, 08:49    [10942965]     Ответить | Цитировать Сообщить модератору
 Re: SQL Server 2005 и рекурсивный запрос на вставку  [new]
Mr.Hitman_47
Member

Откуда: Константиновка
Сообщений: 6
iap
Mr.Hitman_47
в триггере можно обрабатывать каждую запись в запросе, можно по подробнее
Обрабатывать надо не одну, а все записи сразу.
Вот в чём фокус-то!

Впрочем, если это, всё-таки, разовая операция, то можно вставлять и построчно.
Например, в цикле по курсору. Курсор - на базе рекурсивного CTE.
Триггер тогда не нужен. И вспомогательное поле для старого id тоже.
Нужна будет функция SCOPE_IDENTITY() и т.п.


Как можно в цикле по курсору есть примерчик
8 июл 11, 12:24    [10944614]     Ответить | Цитировать Сообщить модератору
 Re: SQL Server 2005 и рекурсивный запрос на вставку  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Mr.Hitman_47,

http://msdn.microsoft.com/ru-ru/library/ms180169(v=SQL.100).aspx

Много примеров
8 июл 11, 13:41    [10945327]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить