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

Откуда:
Сообщений: 243
Есть код примерно такого содержания:
CREATE TABLE #k (RECID int, ParentID int, Name varchar(200))
... <Заполнение таблицы>
DECLARE @cols varchar(max)
set @cols = '';

WITH asd (ID, RECID, ParentID, Name) AS
(
SELECT RECID as ID, RECID, ParentID, Name FROM #k
UNION ALL
 SELECT z.ID, k.RECID, k.ParentID, k.Name FROM #k k
	JOIN asd z ON z.ParentID = k.RECID
)

... <продолжение кода скрипта>

Код идеально работает на SQL 2005+, а на SQL2000 ругается. Оно и понятно - там еще не было выражения WITH.

Помогите переписать данный код так, чтобы он работал под SQL 2000.

Спасибо.
22 авг 12, 12:48    [13048529]     Ответить | Цитировать Сообщить модератору
 Re: Как адаптировать под SQL 2000?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
В 2000 раскрытие дерева - циклом.
22 авг 12, 12:51    [13048557]     Ответить | Цитировать Сообщить модератору
 Re: Как адаптировать под SQL 2000?  [new]
harisma
Member

Откуда:
Сообщений: 243
pkarklin
В 2000 раскрытие дерева - циклом.

Хорошо. Но КАК?
22 авг 12, 12:55    [13048592]     Ответить | Цитировать Сообщить модератору
 Re: Как адаптировать под SQL 2000?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
harisma
pkarklin
В 2000 раскрытие дерева - циклом.

Хорошо. Но КАК?
while ... begin ... end. Как-то так.
22 авг 12, 12:57    [13048612]     Ответить | Цитировать Сообщить модератору
 Re: Как адаптировать под SQL 2000?  [new]
swaap
Member

Откуда:
Сообщений: 109
harisma,

используйте @@rowcount
22 авг 12, 12:57    [13048613]     Ответить | Цитировать Сообщить модератору
 Re: Как адаптировать под SQL 2000?  [new]
swaap
Member

Откуда:
Сообщений: 109
CREATE TABLE #k (RECID int, ParentID int, Name varchar(200))

create table #tree (id int, lvl int)

declare @lvl int
set @lvl = 1

select RECID, @lvl
into #tree
from #k
where ParentID is null


while @@rowcount > 0 begin
	set @lvl = @lvl + 1
	insert into #tree
	select k.RECID, @lvl
	from #k k
		inner join #tree t on t.RECID = k.ParentID
	where k.lvl = @lvl - 1 
end


как-то так. не проверял!

Сообщение было отредактировано: 22 авг 12, 13:05
22 авг 12, 13:05    [13048680]     Ответить | Цитировать Сообщить модератору
 Re: Как адаптировать под SQL 2000?  [new]
harisma
Member

Откуда:
Сообщений: 243
все равно не понятно :(

Ни как использовать @@rowcount для решения этой задачи, ни где и как применить конструкцию while begin end. :(
22 авг 12, 13:06    [13048689]     Ответить | Цитировать Сообщить модератору
 Re: Как адаптировать под SQL 2000?  [new]
harisma
Member

Откуда:
Сообщений: 243
swaap
CREATE TABLE #k (RECID int, ParentID int, Name varchar(200))

create table #tree (id int, lvl int)

declare @lvl int
set @lvl = 1

select RECID, @lvl
into #tree
from #k
where ParentID is null


while @@rowcount > 0 begin
	set @lvl = @lvl + 1
	insert into #tree
	select k.RECID, @lvl
	from #k k
		inner join #tree t on t.RECID = k.ParentID
	where k.lvl = @lvl - 1 
end


как-то так. не проверял!


Сейчас проверю - отпишусь :)
22 авг 12, 13:07    [13048696]     Ответить | Цитировать Сообщить модератору
 Re: Как адаптировать под SQL 2000?  [new]
harisma
Member

Откуда:
Сообщений: 243
swaap
CREATE TABLE #k (RECID int, ParentID int, Name varchar(200))

create table #tree (id int, lvl int)

declare @lvl int
set @lvl = 1

select RECID, @lvl
into #tree
from #k
where ParentID is null


while @@rowcount > 0 begin
	set @lvl = @lvl + 1
	insert into #tree
	select k.RECID, @lvl
	from #k k
		inner join #tree t on t.RECID = k.ParentID
	where k.lvl = @lvl - 1 
end


как-то так. не проверял!


Я скрипт немного подкорректировал, потому что он совсем не работал, но теперь не работает его вторая часть, а именно цикл while. Он ругается в выражении
	insert into #tree
	select k.RECID, @lvl
	from #k k
		inner join #tree t on t.ID = k.ParentID
	where k.lvl = @lvl - 1 

на то, что у таблицы #k нет поля lvl (его действительно нет). Но что должно быть вместо него...? Не пойму.
22 авг 12, 13:29    [13048878]     Ответить | Цитировать Сообщить модератору
 Re: Как адаптировать под SQL 2000?  [new]
swaap
Member

Откуда:
Сообщений: 109
harisma,

ага, я там напутал малость, наверное правильно будет как-то так:

while @@rowcount > 0 begin
set @lvl = @lvl + 1
insert into #tree
select k2.RECID, @lvl
from #k k1
inner join #k k2 on k2.ParentID = k1.RECID
inner join #tree t on t.RECID = k1.RECID
where t.lvl = @lvl - 1
end
22 авг 12, 13:36    [13048942]     Ответить | Цитировать Сообщить модератору
 Re: Как адаптировать под SQL 2000?  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
harisma
swaap
CREATE TABLE #k (RECID int, ParentID int, Name varchar(200))

create table #tree (id int, lvl int)

declare @lvl int
set @lvl = 1

select RECID, @lvl
into #tree
from #k
where ParentID is null


while @@rowcount > 0 begin
	set @lvl = @lvl + 1
	insert into #tree
	select k.RECID, @lvl
	from #k k
		inner join #tree t on t.RECID = k.ParentID
	where k.lvl = @lvl - 1 
end


как-то так. не проверял!


Я скрипт немного подкорректировал, потому что он совсем не работал, но теперь не работает его вторая часть, а именно цикл while. Он ругается в выражении
	insert into #tree
	select k.RECID, @lvl
	from #k k
		inner join #tree t on t.ID = k.ParentID
	where k.lvl = @lvl - 1 

на то, что у таблицы #k нет поля lvl (его действительно нет). Но что должно быть вместо него...? Не пойму.

ничего
и, кстати, добавьте проверку на отсутствие добавлемых ключей в таблице, а то с каждым проходом они будут будублироваться
22 авг 12, 13:39    [13048958]     Ответить | Цитировать Сообщить модератору
 Re: Как адаптировать под SQL 2000?  [new]
harisma
Member

Откуда:
Сообщений: 243
swaap
harisma,

ага, я там напутал малость, наверное правильно будет как-то так:

while @@rowcount > 0 begin
set @lvl = @lvl + 1
insert into #tree
select k2.RECID, @lvl
from #k k1
inner join #k k2 on k2.ParentID = k1.RECID
inner join #tree t on t.RECID = k1.RECID
where t.lvl = @lvl - 1
end


Хорошо. Так оно вроде заработало. Спасибо.
В результате я имею разбивку записей исходной таблицы по уровням.
Теперь возникла вторая проблемка: надо чуток этот скрипт модифицировать так, чтобы было видно в таблице #tree связи между уровнями. Другими словами, конечная задача состоит в том, чтобы зная RECID записи конечного уровня (наивысшее значение lvl), получить цепочку уровней с более низким значением lvl, для которых эта запись будет дочерней. И так до уровня с lvl = 1.
22 авг 12, 13:57    [13049127]     Ответить | Цитировать Сообщить модератору
 Re: Как адаптировать под SQL 2000?  [new]
harisma
Member

Откуда:
Сообщений: 243
Поясню подробнее.
Согласно приведенному выше скрипту, в таблице #к имеем такой набор записей:
RecIDName ParentID
1aaaa0
2bbbb0
3cccc2
4dddd1
5eeee3
6ffff5

В таблице #tree в результате будет такой набор записей:
RecIDParentIDNameLvl
10aaaa1
20bbbb1
32cccc2
41dddd2
53eeee3
65ffff4

Вопрос состоит в том, чтобы модифицировать скрипт таким образом, чтобы были видны связи между уровнями.
На данный момент у меня скрипт вот такой:
IF OBJECT_ID('TempDB..#k') IS NOT NULL DROP TABLE #k
CREATE TABLE #k (RECID int, ParentID int, Name varchar(200))

INSERT INTO #k
SELECT 1, 0, 'aaaa'
UNION SELECT 2, 0, 'bbbb'
UNION SELECT 3, 2, 'cccc'
UNION SELECT 4, 1, 'dddd'
UNION SELECT 5, 3, 'eeee'
UNION SELECT 6, 5, 'ffff'

IF OBJECT_ID('TempDB..#tree') IS NOT NULL DROP TABLE #tree
create table #tree (recid int, parentId int, Name varchar(200), lvl int) 

declare @lvl int
set @lvl = 1

insert into #tree
select k.RECID, k. parentID, k.Name, @lvl
from #k k
where k.ParentID = 0

while @@rowcount > 0 begin
  set @lvl = @lvl + 1
  insert into #tree
  select k2.RECID, k2.ParentID, k2.Name, @lvl
  from #k k1
    inner join #k k2 on k2.ParentID = k1.RECID
    inner join #tree t on t.RECID = k1.RECID
  where t.lvl = @lvl - 1
end 

select * from #tree
22 авг 12, 14:16    [13049305]     Ответить | Цитировать Сообщить модератору
 Re: Как адаптировать под SQL 2000?  [new]
swaap
Member

Откуда:
Сообщений: 109
harisma,


тогда, например, можно добавить еще один столбец [path] varchar(255) и туда писать путь path + '/' + cast(k1.RECID)
22 авг 12, 15:36    [13050058]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить