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

Откуда: Москоу сити
Сообщений: 90
есть таблица t1, в ней триггер на insert

в триггере происходит insert в таблицу t2

в итоге, в asp-шке, при попытке возвращения @@identity, получаю id последней записи, вставленной в t2

а нужен id из t1

как бы этого добиться ?
26 июн 09, 20:47    [7350376]     Ответить | Цитировать Сообщить модератору
 Re: @@identity и триггер на insert  [new]
Crimean
Member

Откуда:
Сообщений: 13148
-- де-тов триггере ты знаешь, что надо вернуть как @@identity
declare @id int
set @id = 123
declare @s varchar(200)
set @s = 'declare @a table( id int identity( ' + str( @id ) + ', 1)); insert into @a default values;'
exec ( @s )
-- конец триггера
select @@identity

разумеется, можно пользовать sp_executesql, только тогда переменная должна быть nvarchar
26 июн 09, 21:05    [7350394]     Ответить | Цитировать Сообщить модератору
 Re: @@identity и триггер на insert  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
А SCOPE_IDENTITY() почему нельзя?
26 июн 09, 21:20    [7350408]     Ответить | Цитировать Сообщить модератору
 Re: @@identity и триггер на insert  [new]
gallam
Member

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

Можно триггер на intead of или after.
26 июн 09, 22:25    [7350511]     Ответить | Цитировать Сообщить модератору
 Re: @@identity и триггер на insert  [new]
VladimirKr
Member

Откуда: СПб
Сообщений: 1050
Marvin_ru,
У аксессовцев часто используется такой прием: MS SQL + ADO
27 июн 09, 16:49    [7351360]     Ответить | Цитировать Сообщить модератору
 Re: @@identity и триггер на insert  [new]
Marvin_ru
Member

Откуда: Москоу сити
Сообщений: 90
всем спасибо, подошло решение Crimean

to iap

скоуп идентити в случае MSSQL2000 работает нормально, в случае MSSQL2005 почему-то возвращает ноль
28 июн 09, 23:36    [7352930]     Ответить | Цитировать Сообщить модератору
 Re: @@identity и триггер на insert  [new]
Marvin_ru
Member

Откуда: Москоу сити
Сообщений: 90
to gallam

с after триггером экспериментировал, не получилось
28 июн 09, 23:48    [7352952]     Ответить | Цитировать Сообщить модератору
 Re: @@identity и триггер на insert  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Marvin_ru
всем спасибо, подошло решение Crimean

to iap

скоуп идентити в случае MSSQL2000 работает нормально, в случае MSSQL2005 почему-то возвращает ноль
SCOPE_IDENTITY() в SQL2000 и SQL2005 ничем не отличаются.
Может, триггер INSTEAD OF INSERT ещё есть в SQL2005?
В SQL2005 вместо SCOPE IDENTITY() можно (а, по-моему, нужно) использовать OUTPUT в команде INSERT.
По крайней мере, в этом случае можно получить не только последнее вставленное значение IDENTITY.
29 июн 09, 08:57    [7353390]     Ответить | Цитировать Сообщить модератору
 Re: @@identity и триггер на insert  [new]
:)-:)
Guest
iap

В SQL2005 вместо SCOPE IDENTITY() можно (а, по-моему, нужно) использовать OUTPUT в команде INSERT.
По крайней мере, в этом случае можно получить не только последнее вставленное значение IDENTITY.

Не получится, нельзя использовать Output, если на таблице есть триггер
29 июн 09, 09:01    [7353393]     Ответить | Цитировать Сообщить модератору
 Re: @@identity и триггер на insert  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
:)-:)
iap

В SQL2005 вместо SCOPE IDENTITY() можно (а, по-моему, нужно) использовать OUTPUT в команде INSERT.
По крайней мере, в этом случае можно получить не только последнее вставленное значение IDENTITY.

Не получится, нельзя использовать Output, если на таблице есть триггер
Что за сказки рассказываете?
А почему вот это работает?

USE tempdb;
SET NOCOUNT ON;
GO
IF OBJECT_ID(N'T','U') IS NOT NULL DROP TABLE T;
GO
CREATE TABLE T(ID INT NOT NULL IDENTITY);
GO
CREATE TRIGGER InsertIntoT ON T FOR INSERT AS RETURN;
GO
DECLARE @T TABLE (ID INT NULL);

INSERT T
OUTPUT inserted.ID INTO @T(ID)
DEFAULT VALUES;

SELECT * FROM @T;
GO
DROP TABLE T;
GO
Другое дело, если есть триггер INSTEAD OF INSERT.
В этом случае, как и со SCOPE_IDENTITY(), вернётся NULL
29 июн 09, 09:27    [7353448]     Ответить | Цитировать Сообщить модератору
 Re: @@identity и триггер на insert  [new]
Marvin_ru
Member

Откуда: Москоу сити
Сообщений: 90
iap,

может я с ADO как-то не правильно работаю ?

чистый asp :


Session("open_conn").execute("insert into ..."); // вставляю запись в таблицу

var recordSet = Server.CreateObject("ADODB.Recordset");

if (SQLSERVER_VER == "MSSQL2000") recordSet.Open("select SCOPE_IDENTITY() as ret1",Session("open_conn"),3);
else if (SQLSERVER_VER == "MSSQL2005") recordSet.Open("select @@IDENTITY as ret1",Session("open_conn"),3); 
				
result = recordSet.Fields.Item("ret1").Value;   // достаю идентити

29 июн 09, 09:32    [7353457]     Ответить | Цитировать Сообщить модератору
 Re: @@identity и триггер на insert  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Marvin_ru
iap,

может я с ADO как-то не правильно работаю ?

чистый asp :


Session("open_conn").execute("insert into ..."); // вставляю запись в таблицу

var recordSet = Server.CreateObject("ADODB.Recordset");

if (SQLSERVER_VER == "MSSQL2000") recordSet.Open("select SCOPE_IDENTITY() as ret1",Session("open_conn"),3);
else if (SQLSERVER_VER == "MSSQL2005") recordSet.Open("select @@IDENTITY as ret1",Session("open_conn"),3); 
				
result = recordSet.Fields.Item("ret1").Value;   // достаю идентити

Перехватите в Profilerе, что у Вас на сервер приходит. Покажите это здесь.
Да я думаю, Вам и самому сразу всё станет ясно.
По крайней мере, скажите, как Вы обеспечиваете один и тот же SCOPE для INSERTа и вызова SCOPE_IDENTITY()?
29 июн 09, 09:38    [7353475]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить