Проблема идентификации SQL Server - PullRequest
11 голосов
/ 12 апреля 2010

У меня есть запрос, как показано ниже

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» - имя сервера, которое я использовал. Если я удаляю это, я могу получить значение идентичности в моем параметре.

Ответы [ 6 ]

9 голосов
/ 12 апреля 2010

См. этот старый вопрос для аналогичной проблемы: Вы не можете получить переменную с областью, например SCOPE_IDENTITY(), с другого сервера. Вместо этого вы должны использовать хранимую процедуру на удаленном сервере для достижения этой цели.

5 голосов
/ 12 апреля 2010

Когда вы используете «IMDECONP38», вы нарушаете SCOPE_IDENTITY, потому что

  • область INSERT теперь находится на связанном сервере IMDECONP38
  • SCOPE_IDENTITY запускается на локальном сервере, а не IMDECONP38

Если в 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′
)

Редактировать: Prutswonder первым сказал: используйте сохраненный процесс на связанном сервере

2 голосов
/ 14 апреля 2010

Использовать хранимую процедуру в удаленной базе данных.

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
0 голосов
/ 26 июля 2016

Для sql server 2012, чтобы получить имя столбца идентификации

select col_name(sys.all_objects.object_id, column_id) as id from    sys.identity_columns 
join sys.all_objects on sys.identity_columns.object_id = sys.all_objects.object_id
where sys.all_objects.object_id = object_id('system_files')

Если у вас есть связанный сервер, вы можете использовать это:

select iden.name as id 
from [LINKED_SERVER_NAME].[DATABASE_NAME].sys.identity_columns as iden
join [LINKED_SERVER_NAME].[DATABASE_NAME].sys.all_objects allobj
    on iden.object_id = allobj.object_id
where allobj.name = 'TABLE NAME HERE'
0 голосов
/ 12 апреля 2010

Пожалуйста, проверьте, есть ли какие-либо триггеры , установленные для вашей таблицы. Это вызовет проблему при использовании SCOPE_IDENTITY() для получения последнего вставленного поля идентификатора.

НТН

0 голосов
/ 12 апреля 2010
select @@IDENTITY AS 'variablename'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...