как получить ID, сгенерированный при вставке в таблицу на линкованном сервере

Дракоша
Дата: 07.06.2011 18:15:09
Может быть, кто-то собаку на этом съел, а я велосипед изобретаю :) На форуме искала - не нашла...

Задача такая:
Есть 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

Заранее спасибо за любые предложения :)
alexeyvg
Дата: 07.06.2011 18:20:12
Дракоша
Я придумала как "выкрутиться", но хотелось бы узнать, возможно, есть способ попроще, побыстрее.
Или так, или вызывая exec Serv2.bd2.dbo.sp_executesql
Дракоша
Дата: 08.06.2011 11:15:17
alexeyvg
Дракоша
Я придумала как "выкрутиться", но хотелось бы узнать, возможно, есть способ попроще, побыстрее.
Или так, или вызывая exec Serv2.bd2.dbo.sp_executesql


Спасибо огромное alexeyvg !
Получилось то, что надо :) Чуть позже выложу скрипт.
boltnik
Дата: 08.06.2011 12:52:34
Дракоша,

А если что то типа EXECUTE (...) at Serv2 ???