powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос по дереву
6 сообщений из 6, страница 1 из 1
Вопрос по дереву
    #32007499
Maxim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица
TBL(ID int identity,
PARENT_ID int NULL,
NAME varchar(50)not NULL),
которая описывает некое дерево. Задача состоит в получении списка всех дочерних узлов выбранного узла. Т.е. всех узлов, вершиной которого является выбранный узел.
Написал процедуру:
CREATE PROCEDURE sp
@select_id int
AS
DECLARE
@Id int,
@IdOld int,
@Parent_Id int,
@Name varchar(100),
@numrows int,
@nRow int

CREATE TABLE #TMP(
rId int not NULL,
rParent_Id int,
rName varchar(100) not NULL)
if exists(SELECT * FROM TBL WHERE PARENT_ID = @select_id)
BEGIN
SELECT @Id = ID FROM TBL
WHERE PARENT_ID = @select_id
ORDER BY ID
SELECT @numrows = @@rowcount
SELECT @nRow = 0
WHILE @nRow < @numrows
BEGIN
SELECT
@Parent_Id = PARENT_ID,
@Name = NAME
FROM TBL WHERE ID = @Id

INSERT #TMP(rId, rParent_Id, rName)
VALUES(@Id, @Parent_Id, @Name)

EXEC sp @Id

SELECT @IdOld = @Id
SELECT @Id = ID FROM TBL WHERE PARENT_ID = @select_id
AND ID < @IdOld
ORDER BY ID
SELECT @nRow = @nRow + 1
END/*WHILE*/
SELECT * FROM #TMP
END/*IF*/
GO
Такая конструкция выдает несколько результатов, а нужно один.
...
Рейтинг: 0 / 0
Вопрос по дереву
    #32007503
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не понял что значит "выдает несколько результатов, а нужно один", но я бы написал это так:

CREATE PROCEDURE sp @select_id int
AS
declare @d table(id int, level int)
declare @level int
set @level=0

insert @d select @select_id,0

while exists(select * from TBL, @d where id=PARENT_ID and level=@level)
begin
insert @d
select ID, @level+1 from TBL, @d where id=PARENT_ID and level=@level
set @level=@level+1
end

select t.* from TBL t, @d
where id=ID
...
Рейтинг: 0 / 0
Вопрос по дереву
    #32007513
Maxim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо! Работает.
...
Рейтинг: 0 / 0
Вопрос по дереву
    #32007545
Epanch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А в чем преимущество использования
declare @d table(id int, level int)
insert into @d select ...
...
select * from @d

перед
create table #d (id int, level int)
insert into #d select ...
...
select * from #d
...
Рейтинг: 0 / 0
Вопрос по дереву
    #32007549
Павел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Начиная с версии 7 отсутствует возможность размещения tempdb в ram. А именно в tempdb создаются временные таблицы, т.е. неизбежно их физическое создание на диске. А таблицы-переменные создаются в ram. Вот такое преимущество.
...
Рейтинг: 0 / 0
Вопрос по дереву
    #32007562
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Epanch

Наверное лучше чем в BOL не напишешь(топик table variables)

Functions and variables can be declared to be of type table. table variables can be used in functions, stored procedures, and batches.

Use table variables instead of temporary tables, whenever possible . table variables provide the following benefits:

A table variable behaves like a local variable. It has a well-defined scope, which is the function, stored procedure, or batch in which it is declared.
Within its scope, a table variable may be used like a regular table. It may be applied anywhere a table or table expression is used in SELECT, INSERT, UPDATE, and DELETE statements. However, table may not be used in the following statements:

INSERT INTO table_variable EXEC stored_procedure

SELECT select_list INTO table_variable statements.

table variables are cleaned up automatically at the end of the function, stored procedure, or batch in which they are defined.

table variables used in stored procedures result in fewer recompilations of the stored procedures than when temporary tables are used.


Transactions involving table variables last only for the duration of an update on the table variable. Thus, table variables require less locking and logging resources.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос по дереву
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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