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

Откуда:
Сообщений: 43
Имеется таблица MyTable1, которая содержит триггер:
--
CREATE TRIGGER trig_MyTable1 ON dbo.MyTable1
FOR INSERT
AS
INSERT INTO Bak_MyTable1 SELECT * FROM MyTable1
WHERE MyTable1_ID IN (SELECT MyTable1_ID FROM INSERTED)
--
Но после ввода новых значений @@IDENTITY возвращает значение последнего ID из Bak_MyTable1.

Приходится делать что-то типа этого:
--
CREATE TRIGGER trig_MyTable1 ON dbo.MyTable1
INSTEAD OF INSERT
AS
INSERT INTO Bak_MyTable1 SELECT * FROM INSERTED
INSERT INTO MyTable1(Col1, Col2, Col3)
SELECT Col1, Col2, Col3 FROM INSERTED
--
Чтобы @@IDENTITY возвращал значение последнего MyTable1_ID из MyTable1, а не из Bak_MyTable1
Может знатоки подскажут эту хитрость, которая позволит в первом варианте триггера (с FOR INSERT) перенаправить @@IDENTITY на MyTable1. Уверен есть решение с триггером FOR INSERT.

Решений с SCOPE_IDENTITY и IDENT_CURRENT не предлагать.
16 июн 04, 02:54    [743958]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такая хитрость? @@IDENTITY по выбору.  [new]
All
Member

Откуда: Владивосток
Сообщений: 47
А вот что-то типа select [поле-автоинкремент] from inserted... не прокатывает?
16 июн 04, 03:42    [743965]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такая хитрость? @@IDENTITY по выбору.  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
автор
Чтобы @@IDENTITY возвращал значение последнего MyTable1_ID из MyTable1, а не из Bak_MyTable1
Может знатоки подскажут эту хитрость, которая позволит в первом варианте триггера (с FOR INSERT) перенаправить @@IDENTITY на MyTable1. Уверен есть решение с триггером FOR INSERT.

Решений с SCOPE_IDENTITY и IDENT_CURRENT не предлагать.

Вообще то SCOPE_IDENTITY, IDENT_CURRENT и @@IDENTITY совершенно разные вещи.
А значение последнего MyTable1_ID из MyTable1, а не из Bak_MyTable1 если оно инкрементное есть

select max(MyTable1_ID) from inserted
16 июн 04, 06:50    [744012]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такая хитрость? @@IDENTITY по выбору.  [new]
KOLCHOZ_POSTEVENT
Guest
А чо тут хитрить?
Вот,скажем,у меня таблица W,у неё поле id1 identity с максимальным значением 7.
Пуляем вот это,получаем @@identity=7


declare @id_max int,@counter int
select @id_max=max(id1) from W
set @counter=1
create table #t (a int,id1 int identity(1,1))

while(@counter <=@id_max)
begin
insert into #t
select 0
set @counter=@counter+1
end
drop table #t
select @@identity ident
16 июн 04, 12:03    [744703]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такая хитрость? @@IDENTITY по выбору.  [new]
Bubba
Member

Откуда:
Сообщений: 43
Спасибо за ответы.

tpg
select max(MyTable1_ID) from inserted

катит, но задача привязана к @@IDENTITY
т.е., повторюсь, необходимо сделать так чтобы при вставке в таблицу MyTable1, которая имеет этот триггер:
CREATE TRIGGER trig_MyTable1 ON dbo.MyTable1
FOR INSERT
AS
INSERT INTO Bak_MyTable1 SELECT * FROM MyTable1
WHERE MyTable1_ID IN (SELECT MyTable1_ID FROM INSERTED)
@@IDENTITY возвращала последний MyTable1_ID (именно @@IDENTITY).

KOLCHOZ_POSTEVENT
declare @id_max int,@counter int
select @id_max=max(id1) from W
set @counter=1
create table #t (a int,id1 int identity(1,1))

while(@counter <=@id_max)
begin
insert into #t
select 0
set @counter=@counter+1
end
drop table #t
select @@identity ident

- это, конечно, решение, но черезчур сложное, а если таблица W имеет id1 не 7, а 7000, тогда что? Тогда уж лучше второй триггер с INSTEAD OF INSERT.
16 июн 04, 13:04    [744936]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такая хитрость? @@IDENTITY по выбору.  [new]
Гнездин Петр
Member

Откуда: Москва
Сообщений: 359
инсерт с возвратом ид - это и следующее сообщение
16 июн 04, 13:16    [745000]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такая хитрость? @@IDENTITY по выбору.  [new]
KOLCHOZ_POSTEVENT
Guest
Во-первых,как Вам будет угодно,во-вторых это вовсе не решение,а ИНДЕЯ.Поясню,с Вашего позволения.Identity можно стартовать с 1,а можно и с 700,000 и тогда одна команда insert select выводит Вас на требуемый @@identity.Но дело в том,что компайлер не любит переменных параметров в команде alter table,а я не люблю динамического SQL,в борьбе этих провоположностей выродился отвергнутый(справедливо) вами вариант,но ИНДЕЯ вывести @@identity на нужный уровень через таблицу-призрак может быть доведена до кода.
16 июн 04, 16:09    [745822]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такая хитрость? @@IDENTITY по выбору.  [new]
KOLCHOZ_POSTEVENT
Guest
А если к этому делу исчо приплесть,то что подсказал Гнездин Петр,имеется ввиду ссылка на Глорин пост про DBCC CHECKIDENT/Reseed,который ДА-принимает переменный параметр,то без всяких динамо SQL задача решается щелчком.
16 июн 04, 16:27    [745912]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такая хитрость? @@IDENTITY по выбору.  [new]
злой шаман
Member

Откуда: Питер
Сообщений: 1253
А для каких целей вам нужен identity-столбец в Bak_MyTable1?
16 июн 04, 17:31    [746176]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такая хитрость? @@IDENTITY по выбору.  [new]
Bubba
Member

Откуда:
Сообщений: 43
В общем благодоря общим усилиям, в основном усилиям KOLCHOZ_POSTEVENT
и Гнездина Петра разродился я этим триггером:
CREATE TRIGGER trig_MyTable1 ON dbo.MyTable1
FOR INSERT
AS
INSERT INTO Bak_MyTable1 SELECT * FROM MyTable1 A
  WHERE EXISTS (SELECT * FROM INSERTED WHERE MyTable1_ID=A.MyTable1_ID)
DECLARE @EXE_ST VARCHAR(128)
SET @EXE_ST = 'CREATE TABLE #X(ID INT IDENTITY(' + CAST(IDENT_CURRENT('MyTable1') AS VARCHAR(12)) + ',1)); INSERT #X DEFAULT VALUES; DROP TABLE #X;'
EXEC(@EXE_ST)

злой шаман
А для каких целей вам нужен identity-столбец в Bak_MyTable1?

Так оно было. Сам только что задумался. Думаю, так будет быстрее, когда в Bak_MyTable1 будет много записей.
16 июн 04, 20:13    [746531]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такая хитрость? @@IDENTITY по выбору.  [new]
Bubba
Member

Откуда:
Сообщений: 43
Bubba
В общем благодоря...

Считать как "В общем, благодаря"
Еще раз всем спасибо. Все работает как надо.
16 июн 04, 20:17    [746535]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такая хитрость? @@IDENTITY по выбору.  [new]
Bubba
Member

Откуда:
Сообщений: 43
злой шаман
А для каких целей вам нужен identity-столбец в Bak_MyTable1?

Тоже замечательное решение, стоит обдумать...
16 июн 04, 20:27    [746544]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить