Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / создание большого поддерева / 8 сообщений из 8, страница 1 из 1
22.10.2018, 16:15
    #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
22.10.2018, 16:37
    #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
22.10.2018, 16:55
    #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
22.10.2018, 17:01
    #39721029
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание большого поддерева
alazanskiyВыглядит получше, чем блокировка целевой и курсор.
Курсор то тебе нафига?
...
Рейтинг: 0 / 0
22.10.2018, 17:09
    #39721030
alazanskiy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание большого поддерева
aleks222alazanskiyВыглядит получше, чем блокировка целевой и курсор.
Курсор то тебе нафига?
Это я до indentity_insert думал про курсор. Тут то понятно что не нужен)
...
Рейтинг: 0 / 0
22.10.2018, 17:13
    #39721032
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание большого поддерева
alazanskiyно 2005 сервер не умеет в merge, и output из insert ... from тоже
output из insert ... from 2005-й умеет вполне
...
Рейтинг: 0 / 0
22.10.2018, 19:19
    #39721123
alazanskiy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание большого поддерева
Сон Веры Павловныalazanskiyно 2005 сервер не умеет в merge, и output из insert ... from тоже
output из insert ... from 2005-й умеет вполне
Умеет, но поля может брать только из inserted, в отличие от update и delete. Я вот совсем забыл это ограничение, из-за чего вопрос и встал
...
Рейтинг: 0 / 0
22.10.2018, 23:03
    #39721165
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание большого поддерева
alazanskiyСон Веры Павловныпропущено...

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


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