У меня есть запрос как ниже
declare @str_CustomerID int
Insert into IMDECONP38.[Customer].dbo.CustomerMaster
( CustomerName , CustomerAddress , CustomerEmail , CustomerPhone )
values ( ‘werw12e’ , ‘jkj12kj’ , ‘3212423sdf’ , ‘1212121′
)
select @str_CustomerID= scope_identity()
После выполнения это возвращает пустой указатель в моем параметре.
Я хочу получить значение идентификационных данных. Как я могу сделать это?
Основным вопросом здесь является "IMDECONP38" - имя сервера, которое я использовал. Если я удаляю это, я могу получить значение идентификационных данных в моем параметре.
Когда вы используете «IMDECONP38», вы нарушаете SCOPE_IDENTITY, потому что
Если на SQL Server 2005, попробуйте OUTPUT , но я не уверен, как это работает для вызова связанного сервера
Insert into IMDECONP38.[Customer].dbo.CustomerMaster
OUTPUT INSERTED.ID --change as needed
( CustomerName , CustomerAddress , CustomerEmail , CustomerPhone )
values ( ‘werw12e’ , ‘jkj12kj’ , ‘3212423sdf’ , ‘1212121′
)
Правка: Прутсвондер сказал это первым: используйте сохраненную процедуру на связанном сервере
Пожалуйста, проверьте, установлены ли для вашей таблицы какие-либо триггеры . Это вызовет проблему при использовании SCOPE_IDENTITY ()
для получения последнего вставленного поля идентификации.
HTH
Смотрите этот старый вопрос для аналогичной проблемы: Вы не можете получить скопированную переменную типа SCOPE_IDENTITY()
с другого сервера. Вместо этого необходимо использовать хранимую процедуру на удаленном сервере.
Использовать хранимую процедуру в удаленной базе данных.
CREATE PROCEDURE InsertCustomer (@name varchar(100), @address varchar(100),
@email varchar(100), @phone varchar(100), @id int OUT)
AS
INSERT INTO dbo.CustomerMaster
(CustomerName , CustomerAddress , CustomerEmail , CustomerPhone )
VALUES (@name, @address, @email, @phone)
SET @id = SCOPE_IDENTITY()
GO
DECLARE @id int
EXEC IMDECONP38.Customer.dbo.InsertCustomer 'Fred','Bedrock','a@b','5',@id OUT
GO