2017-12-27 326 views
0

工作,我已经在我做的插入,并通过调用SCOPE_IDENTITY()SQL服务器:起床SCOPE_IDENTITY()不与链接服务器

... 
INSERT INTO [RemoteDB].[dbo].[Table] (StageID, UserID, Date) 
VALUES (4, @userID, @date) 

SET @id = SCOPE_IDENTITY() 

INSERT INTO [RemoteDB].[dbo].[Table2] (ID) 
VALUES (@id) 
... 

一切检索该行的ID存储过程工作正常,当我我的3数据库在同一台服务器上,但在生产中,其中一个数据库是远程的(所以我使用链接服务器)。

我的查询的第一次插入工作,但第二次插入不运行。我认为这是因为SCOPE_IDENTITY()

我的错误是:

的OLE DB提供程序未能INSERT INTO ... “的值违反了该列的完整性约束。”。

这意味着它不能够得到的SCOPE_IDENTITY()

需要注意的是,我执行存储过程不是在远程服务器上的@id,他们在当地的一个。

我做错了什么?

enter image description here

+0

我知道,因为它没有检索ID,但当我在同一台服务器上拥有所有数据库时,它会检索它。 – user3127554

+0

INSERT INTO [RemoteDB]。[dbo]。[Table](StageID,UserID,Date) OUTPUT Inserted.ID VALUES(4,@ userID,@date)'这可以有什么帮助吗? –

+0

我的第一张插入作品,插入了一行。但它不会得到该行的ID(当我使用远程srv) – user3127554

回答

1

SCOPE_IDENTITY(以及类似)是行不通的,你想与链接服务器的方式。从MSDN docs

返回插入标识列在 同一范围内的最后一个标识值。范围是一个模块:存储过程,触发器,函数或批处理。因此,如果两个语句在同一个存储过程,函数或批处理中,它们处于相同的范围。

由于您的插入正在您的远程服务器上发生,并且您的SCOPE_IDENTITY调用是在本地进行的,所以它们在不同的作用域内执行。因此你的SCOPE_IDENTITY调用可能返回NULL,因此违反约束。

你有几个选择来解决这个问题。第一种方法是在远程服务器上编写一个可执行的存储过程,以便a)处理一个proc中的所有插入,或者b)处理单个插入并返回插入的标识。 (或者,您可以使用dynamic-sql-esque解决方案在远程服务器上执行与建议的存储过程相同的语句。)无论您选择做什么,最终目标都是您必须确保拨打SCOPE_IDENTITY发生在同一批次的远程服务器上,否则无法工作。