在链接服务器中获取插入行的标识?

问题描述 投票:0回答:4

我正在使用链接服务器在远程 SQL Server 中插入记录,现在我想获取插入记录的 id。类似本地服务器中的

scope_identity()
。 我的远程SQL Server是2000版本。

我已经看过这篇文章,但我无法在远程 SQL Server 中添加任何存储过程。

sql-server sql-server-2000 linked-server
4个回答
15
投票

您可以使用远程端的

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');

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-04-29的评论更新。


0
投票

感谢您指导我们

查看文档。

我找到了解决方案。

https://learn.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-executesql-transact-sql?view=sql-server-ver15#syntax

DECLARE @IntVariable INT,@guardar int  
DECLARE @SQLString NVARCHAR(500);  
DECLARE @ParmDefinition NVARCHAR(500);  
DECLARE @ScopeIdentity TABLE (ID int);

/* Build the SQL string one time.*/  
SET @SQLString =  
N'INSERT INTO [DATABSE].DBO.TABLE (ITEM1,ITEM2) VALUES(getdate(),@ID) 
SELECT SCOPE_IDENTITY()';
SET @ParmDefinition = N'@ID tinyint';

/* Execute the string with the first parameter value. */  
SET @IntVariable = 1; 

INSERT INTO @ScopeIdentity
EXECUTE [SERVER_LINKED].master..sp_executesql @SQLString, @ParmDefinition, 
@ID = @IntVariable;  
    
SET @RETURN = (SELECT ID FROM @ScopeIdentity);
print @RETURN

-1
投票

尝试这样的事情:

--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
即可获取身份的结果集。 在
INTO
上添加
OUTPUT
,您可以将它们存储在本地计算机上的表/表变量中。

© www.soinside.com 2019 - 2024. All rights reserved.