Проблема с идентификатором SQL Server
У меня есть запрос, как показано ниже
declare @str_CustomerID int
Insert into IMDECONP38.[Customer].dbo.CustomerMaster
( CustomerName , CustomerAddress , CustomerEmail , CustomerPhone )
values ( ‘werw12e’ , ‘jkj12kj’ , ‘3212423sdf’ , ‘1212121′
)
select @str_CustomerID= scope_identity()
После выполнения он возвращает null в моем параметре.
Я хочу получить значение identity. Как я могу это сделать?
Основная проблема здесь - "IMDECONP38" - имя сервера, которое я использовал. Если я удалю это, я могу получить значение identity в моем параметре.
Ответы
Ответ 1
Когда вы используете "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 сначала сказал: используйте сохраненный proc на связанном сервере
Ответ 2
См. этот старый вопрос для аналогичной проблемы: вы не можете получить переменную с областью, подобную SCOPE_IDENTITY()
, с другого сервера. Вместо этого вы должны использовать хранимую процедуру на удаленном сервере для достижения этой цели.
Ответ 3
Использовать хранимую процедуру в удаленной базе данных.
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','[email protected]','5',@id OUT
GO
Ответ 4
Для 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'
Ответ 5
select @@IDENTITY AS 'variablename'
Ответ 6
Проверьте, есть ли триггеры для вашей таблицы. Это вызовет проблему, если вы используете SCOPE_IDENTITY()
для получения последнего вставленного поля идентификации.
НТН