IDENTITY при INSERT'е

6AP6APblCKA

Операция следующего вида:
INSERT tbInsert(Field1,Field2,Field3)
 SELECT @Var1,@Var2,Field3
 FROM tbLookup
 WHERE LookupID=@LookupID
Хочу, чтобы в Field2 вставлялось IDENTITY(int,1,1) (а не @Var2), не удаётся
INSERT tbInsert(Field1,Field2,Field3)
 SELECT @Var1,IDENTITY(int,<b>1</b>,<b>1</b>) AS ID1,Field3
 FROM tbLookup
 WHERE LookupID=@LookupID
т.к.The IDENTITY function can only be used when the SELECT statement has an INTO clause.Не хочу:1) Создавать временную таблицу.2) Создавать временный курсор.Заранее спасибо.
8 ответов

6AP6APblCKA

Способы нумерации результатов SELECT-а есть FAQ.А вопрос этот включен в ТОП10


6AP6APblCKA

Только что смотрел и то и то. Сейчас посмотрю ещё раз.


6AP6APblCKA

/* способ №2 стандартный SQL */
select count (test_2.id_test) as rank, test_1.id_test, test_1.string
from test as test_1 inner join test as test_2 on
	test_1.id_test >= test_2.id_test
group by test_1.id_test, test_1.string
order by rank
go
/* способ №3 стандартный SQL */
select test_3.rank, test_3.id_test, test_3.string
from (select test_1.id_test,
		test_1.string,
		(select count(*) 
			from test as test_2
			where test_2.id_test <= test_1.id_test
		) as rank
	from test as test_1) as test_3
order by rank
go
Интересные хитрости, а неужели нет простой функции? Я искал в направлении IDENTITY(int,1,1) и этот ответ даже не смотрел.


6AP6APblCKA

Интересные хитрости, а неужели нет простой функции? Я искал в направлении IDENTITY(int,1,1) и этот ответ даже не смотрел.
Как вы думаете, если бы такая функция была, то неужели бы за 5 лет существования MSSQL2000 она бы не попала в документацию ?


6AP6APblCKA

Ну откуда мне знать, попала ли она? Я мог и пропустить, поэтому у вас и спрашиваю. А насчёт вопроса: "Если бы мы не пропустили, то мы бы наверно написали в фак?" - может в новой версии есть или появится в будущих версиях. Я не знаю, как часто вы фак обновляете. То, что там написано слишком уж извратно, а вещь элементарная, поэтому я и спрашиваю, неужели за 5 лет не появилась такая функция, тем более что я привожу пример - IDENTITY, которая пролазит только в SELECT INTO (у меня). А может я чего не так пишу там, и на самом деле её можно и в INSERT написать, понимаете?


6AP6APblCKA

То, что там написано слишком уж извратно, а вещь элементарная, поэтому я и спрашиваю, неужели за 5 лет не появилась такая функцияНет, не появилась.Она появилась в следующей версии - SQL2005.Но вы к сожалению о версии своего сервера умолчали.тем более что я привожу пример - IDENTITY, которая пролазит только в SELECT INTO (у меня). А может я чего не так пишу там, и на самом деле её можно и в INSERT написать, понимаете?А почитать BOL что не позволяет ?IDENTITY (Function)Is used only in a SELECT statement with an INTO table clause to insert an identity column into a new table


6AP6APblCKA

Прошу прощения насчёт версии:Microsoft SQL Server 2000 - 8.00.760 (Intel X86) Dec 17 2002 14:22:05 Copyright (c) 1988-2003 Microsoft Corporation Developer Edition on Windows NT 5.0 (Build 2195: Service Pack 4) Т.е. у меня новой функции нет.А по BOL - там я и почерпнул знания про IDENTITY и про то, что она идёт только с INTO. Но как я не раз замечал, то что там написано иногда "обходится" каким-либо образом или даже не соответствует действительности. Основным "за" то, что это обходится была, повторюсь, элементарность вопроса.Извините за мою некорректность и спасибо за ответ, особенно про новую версию.


6AP6APblCKA

А по BOL - там я и почерпнул знания про IDENTITY и про то, что она идёт только с INTO. Но как я не раз замечал, то что там написано иногда "обходится" каким-либо образом или даже не соответствует действительности.
Да что вы такое говорите ? Возможно, в BOL что-то недосказано. Но там не наврано - это уж точно.