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

Откуда:
Сообщений: 4
Добрый день всем, вопрос по оптимальному копированию большого поддерева из другого источника.

Имеется MSSQL 2005, который на данный момент обновлять никак.
Есть таблица
	[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 дерево (в данном случае структура изделия)

Её нужно наполнить данными, приходящими в виде
		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 записей.

Сообщение было отредактировано: 22 окт 18, 16:28
22 окт 18, 16:15    [21711324]     Ответить | Цитировать Сообщить модератору
 Re: создание большого поддерева  [new]
aleks222
Member

Откуда:
Сообщений: 951
Если в целевую таблицу есть возможность поле добавить - все просто.

Либо, если [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 из целевой.
22 окт 18, 16:37    [21711363]     Ответить | Цитировать Сообщить модератору
 Re: создание большого поддерева  [new]
alazanskiy
Member

Откуда:
Сообщений: 4
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 из целевой.


Про добавление поля думал, это можно, первоначально отмёл его как вариант "чёт не оч", но пока в целом за него. Выглядит получше, чем блокировка целевой и курсор.
22 окт 18, 16:55    [21711390]     Ответить | Цитировать Сообщить модератору
 Re: создание большого поддерева  [new]
aleks222
Member

Откуда:
Сообщений: 951
alazanskiy
Выглядит получше, чем блокировка целевой и курсор.

Курсор то тебе нафига?
22 окт 18, 17:01    [21711401]     Ответить | Цитировать Сообщить модератору
 Re: создание большого поддерева  [new]
alazanskiy
Member

Откуда:
Сообщений: 4
aleks222
alazanskiy
Выглядит получше, чем блокировка целевой и курсор.

Курсор то тебе нафига?

Это я до indentity_insert думал про курсор. Тут то понятно что не нужен)
22 окт 18, 17:09    [21711411]     Ответить | Цитировать Сообщить модератору
 Re: создание большого поддерева  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5949
alazanskiy
но 2005 сервер не умеет в merge, и output из insert ... from тоже

output из insert ... from 2005-й умеет вполне
22 окт 18, 17:13    [21711418]     Ответить | Цитировать Сообщить модератору
 Re: создание большого поддерева  [new]
alazanskiy
Member

Откуда:
Сообщений: 4
Сон Веры Павловны
alazanskiy
но 2005 сервер не умеет в merge, и output из insert ... from тоже

output из insert ... from 2005-й умеет вполне

Умеет, но поля может брать только из inserted, в отличие от update и delete. Я вот совсем забыл это ограничение, из-за чего вопрос и встал
22 окт 18, 19:19    [21711617]     Ответить | Цитировать Сообщить модератору
 Re: создание большого поддерева  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
alazanskiy
Сон Веры Павловны
пропущено...

output из insert ... from 2005-й умеет вполне

Умеет, но поля может брать только из inserted, в отличие от update и delete. Я вот совсем забыл это ограничение, из-за чего вопрос и встал

гугл транслейт?
22 окт 18, 23:03    [21711729]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить