【问题标题】:Best way to get identity of inserted row in Linked server?在链接服务器中获取插入行标识的最佳方法?
【发布时间】:2011-08-08 05:11:27
【问题描述】:

我正在使用链接服务器在远程 Sql Server 中插入记录,现在我想获取插入记录的 ID。本地服务器中的 scope_identity() 之类的东西。 我的远程 sql server 是 2000 版本。

我见过this post,但是我无法在远程sql server中添加任何存储过程

【问题讨论】:

    标签: sql-server sql-server-2000 linked-server


    【解决方案1】:

    你可以使用远端的sp_executesql:

    DECLARE @ScopeIdentity TABLE (ID int);
    INSERT INTO @ScopeIdentity
    EXEC server.master..sp_executesql N'
      INSERT INTO database.schema.table (columns) VALUES (values);
      SELECT SCOPE_IDENTITY()';
    SELECT * FROM @ScopeIdentity;

    或者,您可以使用OPENQUERY

    SELECT *
    FROM OPENQUERY(server, '
      INSERT INTO database.schema.table (columns) VALUES (values);
      SELECT SCOPE_IDENTITY() AS ID');

    【讨论】:

    • 这种行为在 SQL 2005/2008 到 2008R2 之间是否发生了变化?
    • @GaryKindel:不知道我明白你的意思,但感谢你的评论,我注意到我当时错过了一件事,第一个 sn 中字符串常量开头的 N -p。 (现在更新了我的答案。)在 SQL Server 2008 R2 中肯定需要它,不确定早期版本。我想知道N 的缺席是否是您提出问题的原因。
    • 我今天遇到了一个问题,原因是尝试通过链接服务器在 INSERT 上使用 Scope_indentity()。我的项目中的这个错误让我措手不及。我只是想知道 Scope_indentity() 在 SQL 2008 中是否总是本地的。认为这可能是 R2 的新行为。
    • @GaryKindel:在 2008 R2 中,它与 2008 年相同,没有任何变化,即 SCOPE_IDENTITY() 是服务器本地的(刚刚测试过)。但是,为什么,如果您使用的是 SQL Server 2005+,最好使用 OUTPUT 子句,例如:INSERT INTO server.db.schema.table (columns) OUTPUT INSERTED.identity_column VALUES (values)。也没有动态部分。
    • 唯一对我有用的是第一个使用远程服务器的 master..sp_executesql
    【解决方案2】:

    另一个变体,如果链接用户有权调用链接服务器上的程序:

    DECLARE @ScopeIdentity int
    EXEC [linkedServerName].[database].[schema].sp_executesql N'
      INSERT INTO [table] ...
      SELECT @ScopeIdentityOut = SCOPE_IDENTITY()',
      N'@ScopeIdentityOut INT OUTPUT',
      @ScopeIdentityOut = @ScopeIdentity OUTPUT
    

    于 2019 年 4 月 29 日按 cmets 更新。

    【讨论】:

    • 我不得不使用这样的 OUTPUT 参数:DECLARE @ScopeIdentity int EXEC [linkedServerName].[database].[schema].sp_executesql N' INSERT INTO [table] ... SELECT SCOPE_IDENTITY()', N'@ScopeIdentityOUT INT OUTPUT', @ScopeIdentityOUT = @ScopeIdentity OUTPUT
    【解决方案3】:

    试试这样的:

    --when RemoteTable is (Rowid int identity(1,1) primary key, rowValue varchar(10))
    exec ('INSERT server.database.owner.RemoteTable (rowValue) VALUES (''wow'');select SCOPE_IDENTITY()')
    

    EXEC 将返回一个包含SCOPE_IDENTITY() 值的结果集

    如果您必须为 SQL Server 2005+ 执行此操作,您只需添加 OUTPUT INSERTED.IdentityColumn 即可获得身份的结果集。在OUTPUT 上添加INTO,您可以将它们存储在本地机器上的表/表变量中。

    【讨论】:

    • 我试过了,但它返回 NULL。怎么了?这是我的代码:exec('insert [(Worker)].Identification.dbo.test (name) values (''gg'');select scope_identity()')
    • 那行不通。它将返回 NULL 或 0。它适用于本地 SQL 数据库,但不适用于链接数据库。
    猜你喜欢
    • 2010-09-07
    • 2012-09-03
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多