SQL Azure作为链接服务器 - >获取插入行的标识

时间:2012-09-10 14:50:27

标签: sql-server-2008 azure azure-sql-database linked-server

我已将Azure云数据库设置为我们的“SQL server 2008 R2”服务器的链接服务器,如此帖所述:http://blogs.msdn.com/b/sqlcat/archive/2011/03/08/linked-servers-to-sql-azure.aspx 我启用了RPC和RPC Out,因为我在某处读过它。

现在的问题是我无法获取刚刚插入的记录的ID。请看一下这个测试表:

CREATE TABLE dbo.TEST
(
   ID INT IDENTITY(1, 1) NOT NULL
   CONSTRAINT PK_TEST_ID PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)

我还创建了这个存储过程:

CREATE PROCEDURE test_create @ID INT OUTPUT
AS
  BEGIN
      -- SET NOCOUNT ON added to prevent extra result sets from
      -- interfering with SELECT statements.
      SET NOCOUNT ON;

      INSERT INTO TEST
      DEFAULT VALUES

      SELECT @ID = SCOPE_IDENTITY()
  END

我试图通过多种方式获取最后插入的值,但它们都没有工作:

DECLARE @ID INT

EXEC AZURE01.TestDB.dbo.test_create @ID OUTPUT
SELECT @ID

INSERT INTO AZURE01.TestDB.dbo.TEST DEFAULT VALUES
SELECT @ID = SCOPE_IDENTITY();
SELECT @ID

INSERT INTO AZURE01.TestDB.dbo.TEST DEFAULT VALUES
SELECT @ID = @@IDENTITY
SELECT @ID

SELECT * FROM OPENQUERY(AZURE01, 'INSERT INTO TestDB.dbo.TEST DEFAULT VALUES; SELECT SCOPE_IDENTITY() AS ID');

DECLARE @ScopeIdentity TABLE (ID int);
INSERT INTO @ScopeIdentity
EXEC AZURE01.master..sp_executesql N'
  INSERT TestDB.dbo.TEST DEFAULT VALUES;
  SELECT SCOPE_IDENTITY()';
SELECT * FROM @ScopeIdentity;

INSERT AZURE01.TestDB.dbo.TEST 
OUTPUT inserted.ID
INTO @ScopeIdentity
DEFAULT VALUES
SELECT * FROM @ScopeIdentity

我理解为什么SCOPE_IDENTITY()和@@ IDENTITY不起作用(因为它们是没有来自链接服务器的信息的本地函数/变量)但是带有输出参数的存储过程应该有效,对吧? (在服务器上本地工作)

任何? : - )

3 个答案:

答案 0 :(得分:0)

您是否考虑过使用GUID(uniqueidentifier)字段而不是int

然后,您可以生成ID客户端(有许多工具可以生成GUID)并在插入中直接传递。

然后您可以选择根据GUID列重新选择行以获取新的int值,或者只使用GUID字段作为PK并完成它。

答案 1 :(得分:0)

- 在azure数据库上创建proc

create proc xxp_GetId

as

begin

--exec xxp_GetId

DECLARE @ID INT

INSERT INTO dbo.bit_CubeGetParameter DEFAULT VALUES 

SELECT @ID = SCOPE_IDENTITY();

SELECT @ID

end

- 现在在sql server上运行此查询

exec <"Link Server">.<"Azure Database Name">.dbo.xxp_GetId

答案 2 :(得分:0)

问题是远程服务器执行。

你可以尝试的是:

EXEC @TSqlBatch AT LinkedServer

这样做是告诉另一端的数据库在本地执行tsql。 这有很多用途。也许它也适用于这种情况,因为Scope_Identity()应该与插入一起在本地执行。

相关问题