Может быть, кто-то собаку на этом съел, а я велосипед изобретаю :) На форуме искала - не нашла...
Задача такая:
Есть 2 линкованных между собой сервера: Serv1 и Serv2. Нужно в хранимке сервера Serv1 (БД bd1) вставить запись в таблицу Credit на Serv2 (БД bd2) и перехватить сгенерированное IDENTITY-значение (планируется его потом использовать для вставки в другую таблицу).
CREATE TABLE [dbo].[credit] (
[id_credit] [int] IDENTITY(1,1) NOT NULL,
[id_agent] [int] NOT NULL,
[summ] [decimal](19, 4) NOT NULL )
Использование SCOPE_IDENTITY(), IDENT_CURRENT(), @@IDENTITY сразу после вставки - не вариант, т.к. они возвращают NULL.
Этот вариант тоже возвращает NULL
declare @id_credit int
INSERT Serv2.bd2.dbo.credit (id_agent, summ)
SELECT 84, 100
select @id_credit = qqq.id
from OPENQUERY(Serv2, 'SELECT IDENT_CURRENT(''Serv2.bd2.dbo.credit'') as id') as qqq
select @id_credit
Я придумала как "выкрутиться", но хотелось бы узнать, возможно, есть способ попроще, побыстрее.
Вот что сработало:
На
Serv2 создаём процедуру:
CREATE PROCEDURE dbo.insert_credit
( @id_agent int,
@summ decimal(19, 4),
@id_credit int output --возвращаем id_credit, сгенерированный при вставке записи
)
AS
BEGIN
SET NOCOUNT ON
INSERT dbo.credit (id_agent, summ)
SELECT @id_agent, @summ
set @id_credit = SCOPE_IDENTITY()
END
GO
А затем вызываем её на
Serv1:
declare @id_credit int
exec Serv2.bd2.dbo.insert_credit
@id_agent = 84,
@summ = 100,
@id_credit = @id_credit output
select @id_credit as id_credit
Заранее спасибо за любые предложения :)