Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Вопрос по дереву
|
|||
|---|---|---|---|
|
#18+
Есть таблица 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 Такая конструкция выдает несколько результатов, а нужно один. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2001, 11:46 |
|
||
|
Вопрос по дереву
|
|||
|---|---|---|---|
|
#18+
Я не понял что значит "выдает несколько результатов, а нужно один", но я бы написал это так: 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2001, 12:35 |
|
||
|
Вопрос по дереву
|
|||
|---|---|---|---|
|
#18+
Спасибо! Работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2001, 13:26 |
|
||
|
Вопрос по дереву
|
|||
|---|---|---|---|
|
#18+
А в чем преимущество использования 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2001, 02:01 |
|
||
|
Вопрос по дереву
|
|||
|---|---|---|---|
|
#18+
Начиная с версии 7 отсутствует возможность размещения tempdb в ram. А именно в tempdb создаются временные таблицы, т.е. неизбежно их физическое создание на диске. А таблицы-переменные создаются в ram. Вот такое преимущество. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2001, 03:29 |
|
||
|
Вопрос по дереву
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2001, 06:51 |
|
||
|
|

start [/forum/search_topic.php?author=booz&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
8ms |
get forum list: |
21ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
20ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
29ms |
get tp. blocked users: |
1ms |
| others: | 666ms |
| total: | 778ms |

| 0 / 0 |
