【问题标题】:SQL Server identity issueSQL Server 身份问题
【发布时间】:2010-04-12 12:09:02
【问题描述】:

我有如下查询

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”——我使用的服务器名称。如果我删除它,我可以在我的参数中获得 identity 的值。

【问题讨论】:

  • 这里的“参数”是什么意思?
  • 表中其实有一个标识列,对吧?愚蠢的问题,但以防万一。 . .

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


【解决方案1】:

请参阅this old question 以了解类似问题:您无法从另一台服务器检索像SCOPE_IDENTITY() 这样的作用域变量。相反,您应该使用远程服务器上的存储过程来实现这一点。

【讨论】:

  • 好电话。迄今为止最好的建议。
【解决方案2】:

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

【讨论】:

  • Sql server 报错:不允许远程表成为带有 OUTPUT 子句的 DML 语句的目标,或 INTO 子句的目标。
【解决方案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','a@b','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'
      

      【讨论】:

      • 使用@@IDENTITY 是危险的,因为它返回从任何范围生成的最后一个ID。
      • 到现在为止,我从未想过要多次为评论点赞。
      【解决方案6】:

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

      HTH

      【讨论】:

      • SET NOCOUNT ON 不会影响 SCOPE_IDENTITY。或者您是否有 MSDN 参考来支持这一点。正如我的问题所指出的,只有 DataAdaptor 会受到此处的 SET NOCOUNT ON stackoverflow.com/questions/1483732/set-nocount-on-usage 的影响
      • @gbn:我遇到了同样的问题,SET NoCount OFF 为我解决了问题。无论如何,我已经把它从我的答案中去掉了:-)。
      • 触发器影响@@Identity的值而不是scope_identity()
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-09
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多