powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0)
18 сообщений из 18, страница 1 из 1
Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0)
    #32058287
mvg_first
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть у меня табличка в которой несколько полей и одно из них идентификатор товара. Товар представлен другой таблицей в которой иерархическая структура. Т.е есть группы товара и просто товары расположенные в группах. Глубина вложенности 10 уровней.

И есть у меня хранимая процедура которая по Id товара строит полный код товара (т.е. строку состоящую из Id всех владельцев данного товара). Построенный Id она возвращает в OUTPUT параметре.

Задача отсортировать указанную табличку по полному коду. Т.е. добавить в нее поле "Полный код" заполнить его значениями, и отсортировать (или сделать SELECT.... ORDER BY)

Помогиет сделать это _быстро_ потому как я не нашел никакого другого варианта кроме как использовать курсор. Но получается слишком медленно.

Хотелось бы что нибудь вроде
Код: plaintext
1.
UPDATE Talble1 SET Full_id = Get_full_ID(T_id)

Но как это сделать в MS SQL 7.0?????
...
Рейтинг: 0 / 0
Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0)
    #32058313
ms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ms
Гость
все верно, и если значение Full_id можно сформировать одним SELECTOM
то
Код: plaintext
1.
UPDATE Talble1 SET Full_id = (SELECT//ваше условие..//)
...
Рейтинг: 0 / 0
Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0)
    #32058318
mvg_first
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
все верно, и если значение Full_id можно сформировать одним SELECTOM
то


Как раз нельзя. Я полный код делаю Несколкими SELECT-ами в цикле пока не дойду до верхнего уровня дерева.

Может кто расскажет как сделать полный код одним селектом при условии что дерево основано на двух полях Id и ParentId/ Причем полный код должен начинаться с Id корня дерева и заканчиватся Id элемента
...
Рейтинг: 0 / 0
Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0)
    #32058344
Фотография Luchkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
имхо, если вложенность ограничена, должно быть что-то вроде этого:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
declare @ID int
set @ID=  7   -- интересующий код элемента справочника
 
 -- таблица test: справочник, в котором поле ID - собственный код, ParentID - код "родителя"
 

select 	CAST(isnull(t10.ID,  0 ) as char( 10 ))+'->'+
	CAST(isnull(t9.ID,  0 )  as char( 10 ))+'->'+
	CAST(isnull(t8.ID,  0 )  as char( 10 ))+'->'+
	CAST(isnull(t7.ID,  0 )  as char( 10 ))+'->'+
	CAST(isnull(t6.ID,  0 )  as char( 10 ))+'->'+
	CAST(isnull(t5.ID,  0 )  as char( 10 ))+'->'+
	CAST(isnull(t4.ID,  0 )  as char( 10 ))+'->'+
	CAST(isnull(t3.ID,  0 )  as char( 10 ))+'->'+
	CAST(isnull(t2.ID,  0 )  as char( 10 ))+'->'+
	CAST(t1.ID as char( 10 )) from test t1
left join test t2  on (t2.ID  = t1.ParentID)
left join test t3  on (t3.ID  = t2.ParentID)
left join test t4  on (t4.ID  = t3.ParentID)
left join test t5  on (t5.ID  = t4.ParentID)
left join test t6  on (t6.ID  = t5.ParentID)
left join test t7  on (t7.ID  = t6.ParentID)
left join test t8  on (t8.ID  = t7.ParentID)
left join test t9  on (t9.ID  = t8.ParentID)
left join test t10 on (t10.ID = t9.ParentID)
where t1.ID = @ID
...
Рейтинг: 0 / 0
Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0)
    #32058346
Фотография Александр Степанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вам надо сделать процедуру, расчитывающую пути для все таблицы целиком, а не для одного товара. Что-то вроде этого:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
create table goods
(
	id int identity( 1 , 1 ) not null primary key clustered,
	parentid int null
)
go

alter table goods add constraint FK_goodsPARENTID_goodsID foreign key(parentid) references goods(id)
create index IX_goods_PARENTID on goods(parentid)
go

insert into goods(parentid) values(null)
insert into goods(parentid) values( 1 )
insert into goods(parentid) values( 1 )
insert into goods(parentid) values( 1 )
insert into goods(parentid) values( 2 )
insert into goods(parentid) values( 2 )
insert into goods(parentid) values( 3 )
insert into goods(parentid) values( 3 )
insert into goods(parentid) values( 4 )
insert into goods(parentid) values( 9 )
go

create procedure getFullPath
As
create table #tmp
(
	id int not null,
	parentid int null,
	path varchar( 7500 ) not null,
	[level] int not null
)
DECLARE @Level int
Set @Level= 1 

insert into #tmp
Select
	*,
	LEFT('000000000'+cast(id As varchar( 10 )), 10 ),
	@Level
From
	goods
Where
	parentid is null

while @@rowcount> 0 
BEGIN
	Set @Level=@Level+ 1 
	INSERT INTO #tmp
	Select
		g.*,
		t.path+'.'+RIGHT('000000000'+cast(g.id As varchar( 10 )), 10 ),
		@Level
	From
		goods g
		inner join #tmp t
			on t.id=g.parentid and t.[level]=@Level- 1 
END

Select * from #tmp 
GO

exec getFullPAth
GO

drop procedure getFullPath
go
drop table goods
go
 /*
Результат:
id          parentid    path                                            level       
----------- ----------- -------------------------------------------- ----------- 
1           NULL        0000000001                                   1
2           1           0000000001.0000000002                        2
3           1           0000000001.0000000003                        2
4           1           0000000001.0000000004                        2
5           2           0000000001.0000000002.0000000005             3
6           2           0000000001.0000000002.0000000006             3
7           3           0000000001.0000000003.0000000007             3
8           3           0000000001.0000000003.0000000008             3
9           4           0000000001.0000000004.0000000009             3
10          9           0000000001.0000000004.0000000009.0000000010  4

*/ 


Вот после и сортировать можно.

С уважением,
Александр Степанов
...
Рейтинг: 0 / 0
Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0)
    #32058402
mvg_first
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Luchkin Dmitry
Вариант с жесткими ограничениями по вложенности уровней мне не нравиться, так как пытаюсь писать универсальную систему и все возможно что в будущих версиях количество уровней будет увеличено :) Но все равно спасибо за идею

To Александр Степанов
Вот что то такоя мне и мерещилось в моих раздумьях, на эту тему перед тем как я обратился сюда с вопросом, спасибо вам что прояснили мои мысли. Именно так и сделаю. Вдруг чего не получится будут взывать о помощи поновой :).
...
Рейтинг: 0 / 0
Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0)
    #32058403
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Помогиет сделать это _ быстро _

Храни полный путь до записи в дереве в качестве атрибута этой записи, а не вычисляй его при обращении. Тогда это будет быстро. Вычисление пути должно производиться при помещении записи в дерево - один раз. А потом только использоваться. Да, под хранение путей придется потратить дополнительное место в БД. Но - одно из двух. Либо скорость, либо размер БД.
...
Рейтинг: 0 / 0
Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0)
    #32058414
Фотография Luchkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Однако, размерчик окажется ещё тот...
Я для себя когда это решал, посчитал, что такая полная сортировка потребуется только в отчётах, а там уже и подождёт пользователь, ничего с ним не случится.
Поэтому сделал SP, которая перегоняет мне из обычного справочника во временный, в котором не одно поле для сортировки, а столько, сколько уровней. Что-то вроде
[GrpTop] [int], [GrpTop-1] [int], ... [Grp1] [int], [ID] [int], [Name] [varchar].
При этом структура генерится "на лету", в зависимости от реальной вложенности.
...
Рейтинг: 0 / 0
Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0)
    #32058421
mvg_first
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Garya
Ну вопервых приоткрою завесу над своей задачей :)
Я оптимизирую работу самописной конфигурации 1С, в которой есть справочник с иерархической структурой "Справочник.Товаров" и есть остатки которые необходимо сортировать в соответствии с иерархией. Так что изменять структуру базы и создавать в ней тригера, а это видимо самый удобный способ вычисления полного кода, мне не хочется, хотя это возможно (правда тригера в 1с-ной базе еще не пробовал).
To Luchkin Dmitry
Т.е. изначально нужно пробежаться по базе и вычислить максимальное количество уровней а потом создать временную таблицу с таким же количеством полей для сортировки?
...
Рейтинг: 0 / 0
Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0)
    #32058431
Фотография Nickolay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотелось бы что нибудь вроде
UPDATE Talble1 SET Full_id = Get_full_ID(T_id)

а так нельзя?
Код: plaintext
1.
2.
DECLARE @full_id int
EXEC @full_id = Get_full_ID T_id
UPDATE Talble1 SET Full_id = @full_id
,или
Код: plaintext
1.
2.
DECLARE @full_id varchar ( 100 )
EXEC Get_full_ID T_id , @full_id OUTPUT
UPDATE Talble1 SET Full_id = @full_id

ксожалению в 1С не силен, так что другого ничего предложить не могу.
...
Рейтинг: 0 / 0
Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0)
    #32058433
Фотография Luchkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у каждого элемента справочника есть ID, ParentID и Lev. Последний вычисляется как раз при изменении средства. Во всяком случае, если при 10 уровнях, да 10 char на уровень, да 10'000 хотябы позиций, -- уже скока... Уже до фига получается зря почти в базе лежит. а ещё индекс по нему наверняка...
Впрочем, что кому нравится...
...
Рейтинг: 0 / 0
Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0)
    #32058458
mvg_first
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TO Nickolay
Так нельзя мне не нужно одним значением заполнить всю таблицу, мне нужно присвоит каждому элементу свой полный код, а твой вариант предлагает одно значени записать всем подряд.
TO Luchkin Dmitry
Не понял о чем ты.... разясни подробнее.
...
Рейтинг: 0 / 0
Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0)
    #32058481
Фотография Luchkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я о том, что поле для полной сортировки, как предлагается, будет занимать... большой объём. А у меня хранится только уровень вложенности (int). Поэтому максимальный уровень вложенности получается select @MaxLev= MAX(Lev) from dict. исходя из этого и формируется строка с запросом на формирование справочника для отчёта типа такой:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
 -- Создание нормализованного справочника
 
select t1.ID as Grp1, t1.ID as Grp2, t1.ID as Grp3, t1.ID, t1.Lev, t1.Name
from Dict t1 where t.Lev =  0 

union

select t1.ParentID as Grp1, t1.ID as Grp2, t1.ID as Grp3, t1.ID, t1.Lev, space(t1.Lev* 2 ) + t1.Name as Name 
from Dict t where t.Lev =  1 

union

select t2.ParentID as Grp1, t1.ParentID as Grp2, t1.ID as Grp3, t1.ID, t1.Lev, space(t1.Lev* 2 ) +t1.Name as Name 
from Dict t1
   LEFT JOIN Dict t2 ON (t1.ParentID = t2.ID)
   where t1.Lev =  2 

union

select t3.ParentID as Grp1, t2.ParentID as Grp2, t1.ParentID as Grp3, t1.ID, t1.Lev, space(t1.Lev* 2 )+t1.Name as Name 
from Dict t1
   LEFT JOIN Dict t2 ON (t1.ParentID = t2.ID)
   LEFT JOIN Dict t3 ON (t2.ParentID = t3.ID)
   where t1.Lev =  3 

order by  1 ,  2 ,  3 ,  4 
...
Рейтинг: 0 / 0
Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0)
    #32058494
mvg_first
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так я ж не храню это в базе, я строю временную таблицу в которую добавляю поле которое и заполняю впоследствии полными кодами :).

Авот совет Александр Степанов мне не подошел. Потому как у меня есть временная таблица в которой только частичная выборка товара из справочника товаров.

Т.е. в моей выборке нет всей ветки от корня и до последнего вложения. Вся ветка находится в отдельной таблице с которой моя временная связаны по идентификатору товара. И заполнять полныи кодами мне необходимо не таблицу справочника а мою временную.

А рассматривать вариант в котором сначала создается указаным образом временная таблица со всеми полными кодами справочника, а потом присоединять ее к моей выборке, не будем ибо как громоздко это очень
...
Рейтинг: 0 / 0
Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0)
    #32058553
Фотография Александр Степанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда должен подойти этот вариант, он расчитает пути только для нужных ID:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
create table goods
(
	id int identity( 1 , 1 ) not null primary key clustered,
	parentid int null
)
go

alter table goods add constraint FK_goodsPARENTID_goodsID foreign key(parentid) references goods(id)
create index IX_goods_PARENTID on goods(parentid)
go

insert into goods(parentid) values(null)
insert into goods(parentid) values( 1 )
insert into goods(parentid) values( 1 )
insert into goods(parentid) values( 1 )
insert into goods(parentid) values( 2 )
insert into goods(parentid) values( 2 )
insert into goods(parentid) values( 3 )
insert into goods(parentid) values( 3 )
insert into goods(parentid) values( 4 )
insert into goods(parentid) values( 9 )
go

 /*
Создание временной таблицы со списком
ID, для которых нужно получить пути.
Будет использована в хранимой процедуре
*/ 
create table #neededIDs
(
	id int not null
)

insert into #neededIDs values( 7 )
insert into #neededIDs values( 9 )
GO

create procedure getFullPath
As
create table #tmp
(
	id int not null,
	parentid int null,
	path varchar( 7500 ) not null
)

insert into #tmp
Select
	g.*,
	RIGHT('000000000'+cast(g.id As varchar( 10 )), 10 )
From
	goods g
	inner join #neededIDs n
		on n.id=g.id

while @@rowcount> 0 
BEGIN
	Update t
	Set
		parentid=g.parentid,
		path=RIGHT('000000000'+cast(g.id As varchar( 10 )), 10 )+'.'+t.path
	From
		#tmp t
		inner join goods g
		on t.parentid=g.id
END

Select id,path from #tmp 
GO

exec getFullPAth
GO

drop procedure getFullPath
go
drop table goods
drop table #neededIDs
go
 /*
Результат:
id          path                                         
----------- -------------------------------------------- 
7           0000000001.0000000003.0000000007             
9           0000000001.0000000004.0000000009             
*/ 

С уважением,
Александр Степанов
...
Рейтинг: 0 / 0
Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0)
    #32058639
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тут в своё время писал, может подойдёт
...
Рейтинг: 0 / 0
Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0)
    #32058666
mvg_first
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Александр Степанов

Я вообщем то как раз и подумывал вместо @Level использовать значение ParentId для заполнения временной таблицы полными кодами. Вы подтвердили мои подумывания. Спасибо за помощь.
...
Рейтинг: 0 / 0
Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0)
    #32058695
mvg_first
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все получилось!!!!!

Единственное что пришлось изменить так это вместо первого Инсерта использовал Апдейт. Так как у меня уже была построенная выборка котрую необходимо заполнить товарами. Ускорение по сравнению с методом который использовал курсор и вызов хранимой процедуры просто бешенное :) Еще раз большое спасибо за помощь!!!
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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