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

Откуда:
Сообщений: 2
Может быть, кто-то собаку на этом съел, а я велосипед изобретаю :) На форуме искала - не нашла...

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

Заранее спасибо за любые предложения :)
7 июн 11, 18:15    [10778580]     Ответить | Цитировать Сообщить модератору
 Re: как получить ID, сгенерированный при вставке в таблицу на линкованном сервере  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31964
Дракоша
Я придумала как "выкрутиться", но хотелось бы узнать, возможно, есть способ попроще, побыстрее.
Или так, или вызывая exec Serv2.bd2.dbo.sp_executesql
7 июн 11, 18:20    [10778606]     Ответить | Цитировать Сообщить модератору
 Re: как получить ID, сгенерированный при вставке в таблицу на линкованном сервере  [new]
Дракоша
Member

Откуда:
Сообщений: 2
alexeyvg
Дракоша
Я придумала как "выкрутиться", но хотелось бы узнать, возможно, есть способ попроще, побыстрее.
Или так, или вызывая exec Serv2.bd2.dbo.sp_executesql


Спасибо огромное alexeyvg !
Получилось то, что надо :) Чуть позже выложу скрипт.
8 июн 11, 11:15    [10781182]     Ответить | Цитировать Сообщить модератору
 Re: как получить ID, сгенерированный при вставке в таблицу на линкованном сервере  [new]
boltnik
Member

Откуда: Калуга/Москва
Сообщений: 144
Дракоша,

А если что то типа EXECUTE (...) at Serv2 ???
8 июн 11, 12:52    [10782128]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить