メイン コンテンツへスキップ
サポート
Microsoft アカウントでサインイン
サインインまたはアカウントを作成してください。
こんにちは、
別のアカウントを選択してください。
複数のアカウントがあります
サインインに使用するアカウントを選択してください。

現象

SCOPE_IDENTITY()関数または @@IDENTITY 関数のいずれかを 使用して ID 列に挿入された値を取得すると、これらの関数が誤った値を返す場合があります。 この問題は、クエリが並列実行プランを使用している場合にのみ発生します。 クエリで並列実行プランを使用する方法の詳細については、Microsoft Downloads に関する次の技術記事の「クエリ内並列処理」セクションを参照してください。

原因

マイクロソフトでは、この問題をこの資料の冒頭に記載したマイクロソフト製品の問題として認識しています。

解決策

累積的な更新プログラムの情報

SQL Server 2008 R2 Service Pack 1

この問題の修正プログラムは、2008 R2 Service Pack 1 SQL Server累積的な更新プログラム 5 で最初にリリースされました。 この累積的な更新プログラム パッケージを入手する方法の詳細については、次の記事番号をクリックして、Microsoft サポート技術情報の記事を表示します。 

26596942008 R2 Service Pack 1 SQL Server累積的な更新プログラム パッケージ 5

                ビルドは累積的なので、各新しい修正プログラム リリースには、すべての修正プログラムと、前の SQL Server R2 修正プログラム リリースに含まれるすべてのセキュリティ修正プログラムが含まれています。 この修正プログラムを含む最新の修正プログラム リリースを適用することを検討することをお勧めします。 詳細については、次のマイクロソフト サポート技術情報番号をクリックしてください。

25676162008 SQL Server R2 Service Pack 1 のリリース後にリリースされた 2008 R2 SQL Server 2008 R2 ビルドのリリース

回避策

並列プランが常に信頼できるとは限りませんので、並列プランが関係する場合は、これらの関数をクエリで使用しなけらお勧めします。 代わりに 、INSERT ステートメントの OUTPUT 句を使用して、次の例に示すように ID 値を取得します。

OUTPUT 句の使用例:

DECLARE @MyNewIdentityValuesテーブル (myidvalues int)
テーブル@A宣言する (ID int 主キー)
値に@A挿入する (1)
テーブル@B宣言する (ID int 主キー ID(1,1)、B int not null)
値に@B挿入する (1)
を選択します。
    [RowCount] = @@RowCount、
    [@@IDENTITY] = @@IDENTITY、
    [SCOPE_IDENTITY] = SCOPE_IDENTITY()

統計プロファイルをオンに設定する
に挿入_ddr_T
inserted.ID に出力@MyNewIdentityValues
    を選択します。
            
b.ID         から @A
            左結合@B b on b.ID = 1
            b2 の b2 @B左結合します。B = -1

            左結合_ddr_T t.T = -1

        存在しない場所 (t2 から * を_ddr_T、t2.ID = -1)
統計プロファイルをオフに設定する

を選択します。
    [RowCount] = @@RowCount、
    [@@IDENTITY] = @@IDENTITY、
    [SCOPE_IDENTITY] = SCOPE_IDENTITY(),
    [IDENT_CURRENT] = IDENT_CURRENT('_ddr_T')
[オプション] から [*] を
@MyNewIdentityValues go

状況でこれらの関数のいずれかを使用する必要がある場合は、次のいずれかの方法を使用して問題を回避できます。

方法 1:

クエリに次のオプションを含める

OPTION (MAXDOP 1)

: これにより、クエリの SELECT 部分のパフォーマンスが低下する可能性があります。

方法 2:

SELECT パーツの値を一連の変数 (または 1 つのテーブル変数) に読み取り、MAXDOP=1 でターゲット テーブルに挿入します。 INSERT プランは並列では得られませんので、適切なセマンティクスが得られませんが、SELECT は並列して目的のパフォーマンスを実現します。

方法 3:

次のステートメントを実行して、並列処理の 最大 度オプションを 1 に設定します。

sp_configure "並列処理の最大度"、1

go

オーバーライドで再構成する

go

: このメソッドは、サーバーのパフォーマンス低下を引き起こす可能性があります。 このメソッドは、テスト環境またはステージング環境で評価していない限り、使用する必要があります。

詳細情報

この問題に関する Microsoft Connect

並列処理の最大度 (MAXDOP)https://msdn.microsoft.com/en-us/library/ms181007.aspx

ヘルプを表示

その他のオプションが必要ですか?

サブスクリプションの特典の参照、トレーニング コースの閲覧、デバイスのセキュリティ保護方法などについて説明します。

コミュニティは、質問をしたり質問の答えを得たり、フィードバックを提供したり、豊富な知識を持つ専門家の意見を聞いたりするのに役立ちます。

この情報は役に立ちましたか?

言語の品質にどの程度満足していますか?
どのような要因がお客様の操作性に影響しましたか?
[送信] を押すと、Microsoft の製品とサービスの改善にフィードバックが使用されます。 IT 管理者はこのデータを収集できます。 プライバシーに関する声明。

フィードバックをいただき、ありがとうございます。

×