Страница: 1 |
Страница: 1 |
Вопрос: последовательности в mssql
Добавлено: 27.01.07 21:59
Автор вопроса:
Neco | Web-сайт:
мне нуна (очень!) в сиквеле в таблице одно уникальное поле (id), значение которого я бы мог использовать далее.
т.е. как я делаю при работе с ораклом:
1. беру seq_my.nextval() - получаю уникальный id.
2. вставляю новую строку с этим id
3. использую этот id далее как захочу.
в сиквеле я так понял всё делается за счёт полей с автоинкрементом - фиг с ним, делаю:
1. вставляю строку
2. теперь хочу его (id) узнать и не понимаю как.
Ответы
Всего ответов: 8
Номер ответа: 1
Автор ответа: boevik
Хранитель чата
ICQ: 137392264
Вопросов: 8
Ответов: 557
Web-сайт:
Профиль | | #1
Добавлено: 27.01.07 23:24
после вставки, select @@identity - возвращает id последнего insert-a на данном коннекте
Номер ответа: 2
Автор ответа: Neco
ICQ: 247906854
Вопросов: 133
Ответов: 882
Web-сайт:
Профиль | | #2
Добавлено: 27.01.07 23:44
да, нашёл этот ход, но не понял прикола вообще - а если мне не это поле понадобилось бы возвращать?
Номер ответа: 3
Автор ответа: boevik
Хранитель чата
ICQ: 137392264
Вопросов: 8
Ответов: 557
Web-сайт:
Профиль | | #3
Добавлено: 27.01.07 23:48
что значит не это поле?
@@identity - это последнее значение функции identity(..), т.е. поле с автоинкрементом.
Номер ответа: 4
Автор ответа: Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #4
Добавлено: 28.01.07 14:19
Вообще Microsoft вызывает не @@IDENTITY, а SCOPE_IDENTITY().
Если тебе нужно возвращать что-то помимо Identity, то можно сделать так:
; SELECT SomeValue, AnotherValue, SCOPE_IDENTITY()
Можно сделать Output-параметром.
Номер ответа: 5
Автор ответа: Neco
ICQ: 247906854
Вопросов: 133
Ответов: 882
Web-сайт:
Профиль | | #5
Добавлено: 28.01.07 15:16
сделал через @@identity
но вообще хотелось бы какой-нибудь универсальный метод. output-параметр пробовал так
insert into tabname (....) output id into @myvar values (....)
но ни фига не получилось - типо @myvar это должна быть таблица объявленная через declare - на фига мне этот гимор, я не понял...
SCOPE_IDENTITY счас попробую
Номер ответа: 6
Автор ответа: boevik
Хранитель чата
ICQ: 137392264
Вопросов: 8
Ответов: 557
Web-сайт:
Профиль | | #6
Добавлено: 28.01.07 19:00
Что SCOPE_IDENTITY, что @@IDENTITY - все одно и тоже.
Номер ответа: 7
Автор ответа: Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #7
Добавлено: 28.01.07 19:09
Это не одно и то же.
Посмотри BOL - у этих двух способов разные области действия.
Номер ответа: 8
Автор ответа: EROS
Вопросов: 58
Ответов: 4255
Профиль | | #8
Добавлено: 28.01.07 21:02
insert into tabname (....) output id into @myvar values (....)
но ни фига не получилось - типо @myvar это должна быть таблица объявленная через declare
@myvar - это переменная, которую на самом деле надо объвлять через declare..
Взгляни, как я это делаю в одной из своих хранимок, а там уж разберешься..
set QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[aspnet_Images_CreateImage]
@GroupName nvarchar(128),
@ContentType nvarchar(128),
@Image varbinary(MAX),
@Alias nvarchar(10),
@Descripton nvarchar(256),
@ImageId int OUTPUT
AS
BEGIN
DECLARE @GroupId int
DECLARE @TypeId int
SET @ImageId = -1
SET @GroupName=dbo.TRIMALL(@GroupName)
SET @ContentType=dbo.TRIMALL(@ContentType)
SET @GroupId = dbo.aspnet_ImagesGroup_GetIdByGroupName(@GroupName)
IF (@GroupId IS NULL)
BEGIN
INSERT INTO aspnet_ImagesGroup
(GroupName)
VALUES (@GroupName)
SET @GroupID = @@IDENTITY
END
SET @TypeId = dbo.aspnet_ImagesType_GetIdByType(@ContentType)
IF (@TypeId IS NULL)
BEGIN
INSERT INTO aspnet_ImagesType
 ContentType)
VALUES (@ContentType)
SET @TypeID = @@IDENTITY
END
INSERT INTO aspnet_Images
 [GroupId]
,[TypeId]
,[Image]
,[Alias]
,[escripton]
VALUES
 @GroupId
,@TypeId
,@Image
,@Alias
,@Descripton)
SET @ImageId = @@IDENTITY
END