Zen*_*uka 6 linked-server azure sql-server-2008 azure-sql-database
我已将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)
)
Run Code Online (Sandbox Code Playgroud)
我也创建了这个存储过程:
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
Run Code Online (Sandbox Code Playgroud)
我试图通过多种方式获取最后插入的值,但它们都没有工作:
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
Run Code Online (Sandbox Code Playgroud)
我理解为什么SCOPE_IDENTITY()和@@ IDENTITY不起作用(因为它们是没有来自链接服务器的信息的本地函数/变量)但是带有输出参数的存储过程应该可以工作,对吧?(在服务器上本地工作)
任何人?:-)
您是否考虑过使用 GUID( uniqueidentifier) 字段来代替或同时使用int?
然后,您可以在客户端生成 ID(有多种工具可以生成 GUID)并将其直接传递到插入中。
然后,您可以选择根据 GUID 列重新选择行以获取新的 int 值,或者仅使用 GUID 字段作为您的 PK 并完成它。
| 归档时间: |
|
| 查看次数: |
1663 次 |
| 最近记录: |