【发布时间】:2012-09-03 11:12:31
【问题描述】:
我已经将我们的 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 不起作用(因为它们是本地函数/变量,没有来自链接服务器的信息)但是带有输出参数的存储过程应该起作用,对吗? (在它工作的服务器上本地)
有人吗? :-)
【问题讨论】:
-
唯一的问题是该解决方案对我没有帮助,因为:“在包含 OUTPUT 子句或嵌套 DML 语句的语句中,不能将远程表用作 DML 目标。”跨度>
-
在他们建议使用存储过程的 cmets 中,这也行不通。
-
你重试了吗?他们刚刚宣布官方支持链接服务器到 Azure SQL 数据库:blogs.msdn.com/b/windowsazure/archive/2012/09/19/…
-
我试过了.. 仍然没有运气。我也在 Windows Azure 表单上问过它:social.msdn.microsoft.com/Forums/en-US/ssdsgetstarted/thread/…
标签: sql-server-2008 azure azure-sql-database linked-server