【发布时间】: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
我正在使用链接服务器在远程 Sql Server 中插入记录,现在我想获取插入记录的 ID。本地服务器中的 scope_identity() 之类的东西。
我的远程 sql server 是 2000 版本。
我见过this post,但是我无法在远程sql server中添加任何存储过程
【问题讨论】:
标签: sql-server sql-server-2000 linked-server
你可以使用远端的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');
【讨论】:
N -p。 (现在更新了我的答案。)在 SQL Server 2008 R2 中肯定需要它,不确定早期版本。我想知道N 的缺席是否是您提出问题的原因。
SCOPE_IDENTITY() 是服务器本地的(刚刚测试过)。但是,为什么,如果您使用的是 SQL Server 2005+,最好使用 OUTPUT 子句,例如:INSERT INTO server.db.schema.table (columns) OUTPUT INSERTED.identity_column VALUES (values)。也没有动态部分。
另一个变体,如果链接用户有权调用链接服务器上的程序:
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 更新。
【讨论】:
DECLARE @ScopeIdentity int EXEC [linkedServerName].[database].[schema].sp_executesql N' INSERT INTO [table] ... SELECT SCOPE_IDENTITY()', N'@ScopeIdentityOUT INT OUTPUT', @ScopeIdentityOUT = @ScopeIdentity OUTPUT
试试这样的:
--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,您可以将它们存储在本地机器上的表/表变量中。
【讨论】: