SQL Server身份问题

时间:2010-04-12 12:09:02

标签: sql sql-server database sql-server-2005 identity

我有一个如下的查询

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。

我想获得身份的价值。我怎么能这样做?

这里的主要问题是“IMDECONP38” - 我使用的服务器名称。如果我删除它,我可以在我的参数中获得身份的值。

6 个答案:

答案 0 :(得分:9)

有关类似问题,请参阅this old question:您无法从其他服务器检索范围内的SCOPE_IDENTITY()变量。相反,您应该使用远程服务器上的存储过程来实现此目的。

答案 1 :(得分:5)

当您使用“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 :(得分:2)

使用远程数据库中的存储过程。

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

答案 3 :(得分:0)

对于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'

答案 4 :(得分:-2)

select @@IDENTITY AS 'variablename'

答案 5 :(得分:-2)

请检查您的表格是否设置了触发器。当您使用SCOPE_IDENTITY()获取最后插入的标识字段时,这将导致问题。

HTH