问题 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。

我想获得身份的价值。我怎样才能做到这一点?

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


3381
2018-04-12 12:09


起源

在这种情况下你是什么意思“参数”? - gbn
@str_CustomerID - Pranay Rana
表中确实有一个标识列,对吧?愚蠢的问题,但以防万一。 。 。 - MJB


答案:


当你使用“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首先说:在链接服务器上使用存储过程


5
2018-04-12 12:19



Sql server给出错误:不允许远程表是具有OUTPUT子句的DML语句的目标,或者是INTO子句的目标。 - Pranay Rana


看到 这个老问题 对于类似的问题:您无法检索范围内的变量 SCOPE_IDENTITY() 从另一台服务器。相反,您应该使用远程服务器上的存储过程来实现此目的。


9
2018-04-12 12:33



好决定。迄今为止最好的建议。 - gbn


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

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

2
2018-04-14 10:58





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

如果您有Linked服务器,则可以使用:

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
2017-07-26 13:45





select @@IDENTITY AS 'variablename'

-2
2018-04-12 12:13



运用 @@IDENTITY 是危险的,因为它返回从任何范围生成的最后一个ID。 - James
乖乖。切勿使用@@ IDENTITY - gbn
我意识到了我的方式的错误。没有更多的投票! - David Fox
到目前为止,我一直想多次赞成评论。 - John Buchanan


请检查是否有 触发器 为你的桌子设置。这会在您使用时导致问题 SCOPE_IDENTITY() 获取最后插入的标识字段。

HTH


-2
2018-04-12 12:21



SET NOCOUNT ON不会影响SCOPE_IDENTITY。或者你有一个MSDN参考来支持这一点。正如我的问题所述,此处只有DataAdaptors可能会受到SET NOCOUNT ON的影响 stackoverflow.com/questions/1483732/set-nocount-on-usage - gbn
@gbn:我有同样的问题,SET NoCount OFF为我做了诀窍。无论如何,我已经从我的答案中取出了:-)。 - Raja
触发器影响@@ Identity的值而不是scope_identity() - HLGEM