powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / создание большого поддерева
8 сообщений из 8, страница 1 из 1
создание большого поддерева
    #39720996
alazanskiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день всем, вопрос по оптимальному копированию большого поддерева из другого источника.

Имеется MSSQL 2005, который на данный момент обновлять никак.
Есть таблица
Код: sql
1.
2.
3.
4.
5.
6.
	[elementID] [bigint] IDENTITY(1,1) NOT NULL,
	[parentElementID] [bigint] NULL,
	[claimID] [bigint] NOT NULL,
	[windchillID] [bigint] NOT NULL,
	[amount] [float] NOT NULL,
	[modifiedByUser] [bit] NOT NULL,


то есть обычное adjacency list дерево (в данном случае структура изделия)

Её нужно наполнить данными, приходящими в виде
Код: sql
1.
2.
3.
4.
5.
6.
		StringID int identity(1,1) not null primary key,
		ChildMaster bigint not null, 
		Amount float not null, 
		ParentMaster bigint, 
		TreeLevel int not null, 		
		ParentStringID int,


где иерархия строится по StringID - ParentStringID, соответственно нужно транслировать связи из одной таблицы в другую.
Хотел сделать временную таблицу для соответствия, но 2005 сервер не умеет в merge, и output из insert ... from тоже.
Возможен ли вообще какой-то вариант кроме курсоров в данном случае? По нажатию кнопки юзера будет перекладываться
от 100 до 10000 записей.
...
Рейтинг: 0 / 0
создание большого поддерева
    #39721016
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если в целевую таблицу есть возможность поле добавить - все просто.

Либо, если [claimID] [bigint] NOT NULL,
[windchillID] [bigint] NOT NULL,
однозначно позволяют связать с
ChildMaster bigint not null,
ParentMaster bigint,

тоже можно.

Если фсе это "низзя":

1) строим дерево во временной таблице
[elementID] [bigint] NOT NULL,
[parentElementID] [bigint] NULL,
[claimID] [bigint] NOT NULL,
[windchillID] [bigint] NOT NULL,
[amount] [float] NOT NULL,
[modifiedByUser] [bit] NOT NULL,

с ПОСЛЕДОВАТЕЛЬНОЙ нумерацией elementID.

2) Блокируем целевую, включаем на ней SET IDENTITY INSERT.
3) Тупо копируем подготовленное дерево в целевую таблицу, прибавив к elementID и parentElementID максимальное значение IDENTITY из целевой.
...
Рейтинг: 0 / 0
создание большого поддерева
    #39721024
alazanskiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222Если в целевую таблицу есть возможность поле добавить - все просто.

Либо, если [claimID] [bigint] NOT NULL,
[windchillID] [bigint] NOT NULL,
однозначно позволяют связать с
ChildMaster bigint not null,
ParentMaster bigint,

тоже можно.

Если фсе это "низзя":

1) строим дерево во временной таблице
[elementID] [bigint] NOT NULL,
[parentElementID] [bigint] NULL,
[claimID] [bigint] NOT NULL,
[windchillID] [bigint] NOT NULL,
[amount] [float] NOT NULL,
[modifiedByUser] [bit] NOT NULL,

с ПОСЛЕДОВАТЕЛЬНОЙ нумерацией elementID.

2) Блокируем целевую, включаем на ней SET IDENTITY INSERT.
3) Тупо копируем подготовленное дерево в целевую таблицу, прибавив к elementID и parentElementID максимальное значение IDENTITY из целевой.

Про добавление поля думал, это можно, первоначально отмёл его как вариант "чёт не оч", но пока в целом за него. Выглядит получше, чем блокировка целевой и курсор.
...
Рейтинг: 0 / 0
создание большого поддерева
    #39721029
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alazanskiyВыглядит получше, чем блокировка целевой и курсор.
Курсор то тебе нафига?
...
Рейтинг: 0 / 0
создание большого поддерева
    #39721030
alazanskiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222alazanskiyВыглядит получше, чем блокировка целевой и курсор.
Курсор то тебе нафига?
Это я до indentity_insert думал про курсор. Тут то понятно что не нужен)
...
Рейтинг: 0 / 0
создание большого поддерева
    #39721032
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alazanskiyно 2005 сервер не умеет в merge, и output из insert ... from тоже
output из insert ... from 2005-й умеет вполне
...
Рейтинг: 0 / 0
создание большого поддерева
    #39721123
alazanskiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловныalazanskiyно 2005 сервер не умеет в merge, и output из insert ... from тоже
output из insert ... from 2005-й умеет вполне
Умеет, но поля может брать только из inserted, в отличие от update и delete. Я вот совсем забыл это ограничение, из-за чего вопрос и встал
...
Рейтинг: 0 / 0
создание большого поддерева
    #39721165
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alazanskiyСон Веры Павловныпропущено...

output из insert ... from 2005-й умеет вполне
Умеет, но поля может брать только из inserted, в отличие от update и delete. Я вот совсем забыл это ограничение, из-за чего вопрос и встал
гугл транслейт?
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / создание большого поддерева
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]