AzureクラウドDBを「SQLサーバー2008R2」にリンクされたサーバーとして設定しました-この投稿のようなサーバー:http://blogs.msdn.com/b/sqlcat/archive/2011/03/08 /linked-servers-to-sql-azure.aspx どこかで読んだので、RPCとRPCOutを有効にしました。
問題は、挿入したばかりのレコードの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が機能しない理由は理解していますが(リンクされたサーバーからの情報を持たないローカル関数/変数であるため)、出力パラメーターを含むストアドプロシージャは機能するはずです。(ローカルで動作するサーバー上で)
誰?:-)