Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как в 2000 написать аналог RowNumber()  [new]
nerv
Member

Откуда:
Сообщений: 734
К примеру такой запрос с нумерацией строк:
DECLARE @i int
SET @i =5
SELECT  @i+ROW_NUMBER() OVER(ORDER BY vi.Iss_id, vi.Vr_id), vi.Iss_id, vi.Vr_id, vi.zv
 FROM VrIss vi
  where vi.zv =1

Хотелось бы иметь совместимость с MS SQL 2000. Как мне в этом случае этот запрос переписать?
2 фев 13, 10:04    [13865512]     Ответить | Цитировать Сообщить модератору
 Re: Как в 2000 написать аналог RowNumber()  [new]
aleks2
Guest
1. Вставка в табличную переменную с identity.
2. Потом выборка из табличной переменной.
2 фев 13, 10:06    [13865520]     Ответить | Цитировать Сообщить модератору
 Re: Как в 2000 написать аналог RowNumber()  [new]
nerv
Member

Откуда:
Сообщений: 734
aleks2,
то есть создать временную таблицу, у которой есть identity и выборка из нее.
Спасибо за решение.
2 фев 13, 10:15    [13865527]     Ответить | Цитировать Сообщить модератору
 Re: Как в 2000 написать аналог RowNumber()  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
select
 identity(int, 6, 1) as n, vi.Iss_id, vi.Vr_id, vi.zv
into
 #t
from
 VrIss vi
where
 vi.zv = 1
order by
 vi.Iss_id, vi.Vr_id;

select * from #t;
2 фев 13, 10:17    [13865531]     Ответить | Цитировать Сообщить модератору
 Re: Как в 2000 написать аналог RowNumber()  [new]
Добрый Э - Эх
Guest
nerv,

R.T.F.F.A.Q. - Возвращение порядковых номеров строк в результирующем наборе
2 фев 13, 13:26    [13865781]     Ответить | Цитировать Сообщить модератору
 Re: Как в 2000 написать аналог RowNumber()  [new]
nerv
Member

Откуда:
Сообщений: 734
Добрый Э - Эх,
благодарю! Столько способов!
3 фев 13, 19:42    [13868895]     Ответить | Цитировать Сообщить модератору
 Re: Как в 2000 написать аналог RowNumber()  [new]
nerv
Member

Откуда:
Сообщений: 734
Кстати, а так уже не работает:
DECLARE @i int
SET @i =5
select
 identity(int, @i, 1) as n, vi.Iss_id, vi.Vr_id, vi.zv
into
 #t
...
3 фев 13, 22:59    [13869463]     Ответить | Цитировать Сообщить модератору
 Re: Как в 2000 написать аналог RowNumber()  [new]
nerv
Member

Откуда:
Сообщений: 734
invm, Второй раз заппустить запрос не получится, пишет, что #t уже существует.
Эта #t создается в памяти, в sysobjects ее нет, поэтому

if exists (select * from sysobjects where type = 'U' and  name = '#t')
begin
	drop table #t
end


не работает. А как проверить существует ли #t в памяти?
3 фев 13, 23:43    [13869604]     Ответить | Цитировать Сообщить модератору
 Re: Как в 2000 написать аналог RowNumber()  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31964
nerv
invm, Второй раз заппустить запрос не получится, пишет, что #t уже существует.
Эта #t создается в памяти, в sysobjects ее нет, поэтому
if exists (select * from sysobjects where type = 'U' and  name = '#t')
begin
	drop table #t
end

не работает. А как проверить существует ли #t в памяти?
Вместо
if exists (select * from sysobjects where type = 'U' and  name = '#t')

напишите
if object_id('#t') is not null
4 фев 13, 00:07    [13869663]     Ответить | Цитировать Сообщить модератору
 Re: Как в 2000 написать аналог RowNumber()  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
nerv
Эта #t создается в памяти, в sysobjects ее нет
#t создается в tempdb.
declare @i int;

set @i = 5;

if object_id('tempdb..#t', 'U') is not null
 drop table #t;
 
select
 identity(int, 1, 1) as n, vi.Iss_id, vi.Vr_id, vi.zv
into
 #t
from
 VrIss vi
where
 vi.zv = 1
order by
 vi.Iss_id, vi.Vr_id;

select n + @i as n, Iss_id, Vr_id, zv from #t;
4 фев 13, 00:12    [13869683]     Ответить | Цитировать Сообщить модератору
 Re: Как в 2000 написать аналог RowNumber()  [new]
aleks2
Guest
invm
nerv
Эта #t создается в памяти, в sysobjects ее нет
#t создается в tempdb.
declare @i int;

set @i = 5;

if object_id('tempdb..#t', 'U') is not null
 drop table #t;
 
select
 identity(int, 1, 1) as n, vi.Iss_id, vi.Vr_id, vi.zv
into
 #t
from
 VrIss vi
where
 vi.zv = 1
order by
 vi.Iss_id, vi.Vr_id;

select n + @i as n, Iss_id, Vr_id, zv from #t;


Блин, как уперто и безграмотно народ советует фсякое фуфло.
Вот нафега тут временные таблицы?

declare @i int;
declare @t table(Iss_id ..., Vr_id..., zv..., n int identity primary key clustered)

set @i = 5;

insert @t(Iss_id, Vr_id, zv)
select vi.Iss_id, vi.Vr_id, vi.zv
from
 VrIss vi
where
 vi.zv = 1
order by
 vi.Iss_id, vi.Vr_id;

select n + @i as n, Iss_id, Vr_id, zv from @t;
4 фев 13, 06:11    [13870259]     Ответить | Цитировать Сообщить модератору
 Re: Как в 2000 написать аналог RowNumber()  [new]
что просто ухххх
Guest
aleks2,

и разница так велика, и выбор так обоснован...
4 фев 13, 07:27    [13870280]     Ответить | Цитировать Сообщить модератору
 Re: Как в 2000 написать аналог RowNumber()  [new]
aleks2
Guest
что просто ухххх
aleks2,

и разница так велика, и выбор так обоснован...

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

Учись.
4 фев 13, 08:28    [13870342]     Ответить | Цитировать Сообщить модератору
 Re: Как в 2000 написать аналог RowNumber()  [new]
baike2000
Member

Откуда:
Сообщений: 177
aleks2
что просто ухххх
aleks2,

и разница так велика, и выбор так обоснован...

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

Учись.


Чему?
автор
Хотелось бы иметь совместимость с MS SQL 2000.

В 2000 вы где табличные переменные возьмете?
4 фев 13, 10:42    [13870815]     Ответить | Цитировать Сообщить модератору
 Re: Как в 2000 написать аналог RowNumber()  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
baike2000
aleks2
пропущено...

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

Учись.


Чему?
автор
Хотелось бы иметь совместимость с MS SQL 2000.

В 2000 вы где табличные переменные возьмете?
Так они появились в 2000-м.
Для применения в UDF
4 фев 13, 10:45    [13870823]     Ответить | Цитировать Сообщить модератору
 Re: Как в 2000 написать аналог RowNumber()  [new]
bacalavr
Member

Откуда:
Сообщений: 311
aleks2
А то! Табличные переменные хоть журнал не грузят. Ибо вне транзакций пребывают.
Учись.

так по ним и статистики нет
и это может ой как не на руку сыграть же
4 фев 13, 11:01    [13870933]     Ответить | Цитировать Сообщить модератору
 Re: Как в 2000 написать аналог RowNumber()  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
bacalavr
aleks2
А то! Табличные переменные хоть журнал не грузят. Ибо вне транзакций пребывают.
Учись.

так по ним и статистики нет
и это может ой как не на руку сыграть же
Зато перекомпиляций при каждом вызове не будет.
Чем гадать, взяли бы и сравнили в данном конкретном случае.
4 фев 13, 11:18    [13871051]     Ответить | Цитировать Сообщить модератору
 Re: Как в 2000 написать аналог RowNumber()  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
aleks2
Табличные переменные хоть журнал не грузят. Ибо вне транзакций пребывают.
Рекомендую взять на вооружение fn_dblog и проверить свое утверждение. А потом уже высказываться столь безапелляционно.
4 фев 13, 11:29    [13871121]     Ответить | Цитировать Сообщить модератору
 Re: Как в 2000 написать аналог RowNumber()  [new]
aleks2
Guest
invm
aleks2
Табличные переменные хоть журнал не грузят. Ибо вне транзакций пребывают.
Рекомендую взять на вооружение fn_dblog и проверить свое утверждение. А потом уже высказываться столь безапелляционно.

Рекомендую не рекомендовать
declare @t table(n int)

begin transaction
insert @t(n) values(1)
rollback transaction

select * from @t


bacalavr
aleks2
А то! Табличные переменные хоть журнал не грузят. Ибо вне транзакций пребывают.
Учись.

так по ним и статистики нет
и это может ой как не на руку сыграть же

От нафега статистика для
select * from @t

?
4 фев 13, 12:23    [13871520]     Ответить | Цитировать Сообщить модератору
 Re: Как в 2000 написать аналог RowNumber()  [new]
Гость333
Member

Откуда:
Сообщений: 3683
aleks2
Табличные переменные хоть журнал не грузят.

Блажен, кто верует.
http://sqlinthewild.co.za/index.php/2010/10/12/a-trio-of-table-variables/, глава "Changes to Table Variables are not logged".
4 фев 13, 12:28    [13871555]     Ответить | Цитировать Сообщить модератору
 Re: Как в 2000 написать аналог RowNumber()  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
aleks2
Рекомендую не рекомендовать
declare @t table(n int)

begin transaction
insert @t(n) values(1)
rollback transaction

select * from @t
И как это доказывает отсутствие записи в журнал? Так что рекомендация остается в силе. Более того, добавлю еще одну: помедитировать над результатами выполнения нижеследующего:
+ Табличная переменная
use tempdb;
checkpoint;

declare @lsn varchar(30), @tid varchar(30);

select @lsn = min([Current LSN]) from fn_dblog(null, null);

begin tran;

declare @t table (object_id int);

insert into @t
 select top (1000)
  a.object_id
 from
  sys.objects a cross join
  sys.objects b;

select top (1)
 @tid = [Transaction ID]
from
 fn_dblog(null, null)
where
 [Current LSN] > @lsn and
 SPID = @@spid and
 Operation = 'LOP_BEGIN_XACT' and
 [Xact Type] = 1
order by
 [Current LSN] desc;

commit;
 
select
 sum([Log Record Length]) as [Log space used]
from
 fn_dblog(null, null)
where
 [Transaction ID] = @tid;
go
Log space used
73188
+ Временная таблица
use tempdb;
checkpoint;

declare @lsn varchar(30), @tid varchar(30);

select @lsn = min([Current LSN]) from fn_dblog(null, null);

if object_id('tempdb..#t', 'U') is not null
 drop table #t;

begin tran;

create table #t (object_id int);

insert into #t
 select top (1000)
  a.object_id
 from
  sys.objects a cross join
  sys.objects b;

select top (1)
 @tid = [Transaction ID]
from
 fn_dblog(null, null)
where
 [Current LSN] > @lsn and
 SPID = @@spid and
 Operation = 'LOP_BEGIN_XACT' and
 [Xact Type] = 1
order by
 [Current LSN] desc;

commit;
 
select
 sum([Log Record Length]) as [Log space used]
from
 fn_dblog(null, null)
where
 [Transaction ID] = @tid;
go
Log space used
75788
+ Временная таблица + select into...
use tempdb;
checkpoint;

declare @lsn varchar(30), @tid varchar(30);

select @lsn = min([Current LSN]) from fn_dblog(null, null);

if object_id('tempdb..#t', 'U') is not null
 drop table #t;

begin tran;

select top (1000)
 a.object_id
into
 #t
from
 sys.objects a cross join
 sys.objects b;

select top (1)
 @tid = [Transaction ID]
from
 fn_dblog(null, null)
where
 [Current LSN] > @lsn and
 SPID = @@spid and
 Operation = 'LOP_BEGIN_XACT' and
 [Xact Type] = 1
order by
 [Current LSN] desc;

commit;
 
select
 sum([Log Record Length]) as [Log space used]
from
 fn_dblog(null, null)
where
 [Transaction ID] = @tid;
go
Log space used
4044
4 фев 13, 13:11    [13871903]     Ответить | Цитировать Сообщить модератору
 Re: Как в 2000 написать аналог RowNumber()  [new]
aleks2
Guest
Гость333
aleks2
Табличные переменные хоть журнал не грузят.

Блажен, кто верует.
http://sqlinthewild.co.za/index.php/2010/10/12/a-trio-of-table-variables/, глава "Changes to Table Variables are not logged".

Вы чо, совсем плохие?
Никтож не обещал, что "ваще никуда ничаго не пишется".
Это физически невозможно, ибо размер табличной перменной неограничен, ну т.е. ограничен как у любой таблицы, но сильно бАльшой.
Так что утрите сопли и угомонитесь.
4 фев 13, 13:15    [13871936]     Ответить | Цитировать Сообщить модератору
 Re: Как в 2000 написать аналог RowNumber()  [new]
Гость333
Member

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

Ну тогда поясните, что значит это ваше "Табличные переменные хоть журнал не грузят".
4 фев 13, 13:33    [13872108]     Ответить | Цитировать Сообщить модератору
 Re: Как в 2000 написать аналог RowNumber()  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
aleks2
Вы чо, совсем плохие?
Никтож не обещал, что "ваще никуда ничаго не пишется".
Это физически невозможно, ибо размер табличной перменной неограничен, ну т.е. ограничен как у любой таблицы, но сильно бАльшой.
Так что утрите сопли и угомонитесь.
aleks2 всегда прав, ибо aleks2 не может быть неправ
Ну да, ссылок читать не хотим, примеров выполнять тоже не хотим. Но зато все на свете знаем...

Ну и прежде чем что-то называть "фуфлом", нужно иметь доказательства оного.
4 фев 13, 13:37    [13872140]     Ответить | Цитировать Сообщить модератору
 Re: Как в 2000 написать аналог RowNumber()  [new]
aleks2
Guest
invm
aleks2
Вы чо, совсем плохие?
Никтож не обещал, что "ваще никуда ничаго не пишется".
Это физически невозможно, ибо размер табличной перменной неограничен, ну т.е. ограничен как у любой таблицы, но сильно бАльшой.
Так что утрите сопли и угомонитесь.
aleks2 всегда прав, ибо aleks2 не может быть неправ
Ну да, ссылок читать не хотим, примеров выполнять тоже не хотим. Но зато все на свете знаем...

Ну и прежде чем что-то называть "фуфлом", нужно иметь доказательства оного.


Пример "нетранзакционности" табличных переменных я те привел.
Отсутствие необходимости разбираться с if object_id('#t') is not null - эта тоже плюс.
Примерами "minimally logged operations" - меня не удивишь.

Так что фуфло - оно остается фуфлом.
4 фев 13, 13:44    [13872180]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить