6

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が機能しない理由は理解していますが(リンクされたサーバーからの情報を持たないローカル関数/変数であるため)、出力パラメーターを含むストアドプロシージャは機能するはずです。(ローカルで動作するサーバー上で)

誰?:-)

4

3 に答える 3

0

uniqueidentifierの代わりに、または同様にGUID () フィールドを使用することを検討しましたintか?

次に、クライアント側で ID を生成し (GUID を生成するためのツールが多数あります)、それを直接挿入に渡すことができます。

次に、GUID 列に基づいて行を再選択して新しい int 値を取得するか、GUID フィールドを PK として使用するかを選択できます。

于 2013-01-02T22:34:00.360 に答える
0

問題は、リモート サーバーの実行です。

あなたが試すことができるのは:

EXEC @TSqlBatch AT LinkedServer

これが行うことは、反対側のデータベースに tsql をローカルで実行するように指示することです。これには多くの用途があります。Scope_Identity() は挿入とともにローカルで実行する必要があるため、この場合にも役立つ可能性があります。

于 2015-05-07T13:52:01.550 に答える
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 サーバーでこのクエリを実行します。

exec <"Link Server">.<"Azure Database Name">.dbo.xxp_GetId
于 2013-03-07T02:58:20.700 に答える