2011-10-20 9 views
1

私はSQL Server 2K8を使用しており、プライマリキーが複数のテーブルにわたって一意であるようにIDを生成するためにテーブルを使用しています - 複数のテーブルにわたる一意性は、タイプに関係なく、各ノードに一意のIDが必要です。一時テーブルから複数のID列を出力

これは、レコードを1つずつ挿入する場合、IDを抽出するために通常は@@ IDENTITYが使用される1つの自動インクリメントID列しかありません。しかし、私はバッチで挿入を最適化して実行しようとしていますが、まずこのテーブルからIDのバッチを生成する必要があります。

CREATE TABLE [dbo].[MyTreeElementIDGenTab](
     [MyTreeElementID] [int] IDENTITY(1,1) NOT NULL 
) 

はまた、私は、私はwhileループ/カーソルを使用することができます知っているが、行データの一時テーブルを指定した場合、私は中に設定するには、このテーブルからIDを取得するには、SQLバッチステートメントを使用することができればと思いまして実際の表に挿入する前に一時表を作成します。

私は、ROW_NUMBER()を使ってインデックスを生成し、対応するインデックスを初期テーブルに置くことができると考えていましたが、何も進歩しませんでした。どんな助けもありがとう!

DECLARE @NodeTypeATab TABLE 
(
    NodeTypeATabId INT NULL,  -- To be populated by dbo.MyTreeElementIDGenTab 
    Name NVARCHAR(MAX), 
    ItemIndex INT NOT NULL  -- I can initially populate this from the client starting 
          -- with Index # 1 for joining but maybe I don't need it? 
) 

-- Populate @NodeTypeATab with test data here 

DECLARE @EntityIdTab TABLE 
( 
    ElementId INT NOT NULL, 
    ItemIndex INT NOT NULL 
) 

-- This below doesn't compile to generate a new ElementId to later be set in NodeTypeATabId above 
-- I want to output the generated ID into the temp table but also have a "correlation/index ID" to set 
-- back in the original table or some way if not via a correlation/index ID 

INSERT INTO dbo.MyTreeElementIDGenTab DEFAULT VALUES 
OUTPUT INSERTED.MyTreeElementID, ROW_NUMBER() OVER(ORDER BY MyTreeElementID ASC) INTO @EntityIdTab 
FROM @NodeTypeATab 

答えて

1

ないあなたが生成されたIDを入れたいが、あなたは一度に複数のIDを生成するために、マージとnumbers tableを使用することができますどこ私は理解していることを確認してください。次に、master..spt_valuesを使用して10個のIDを生成するサンプルコードを示します。

merge into MyTreeElementIDGenTab as T 
using (select Number 
     from master..spt_values 
     where Number between 1 and 10 and 
      [Type] = 'P') as S(I) 
on 0=1 
when not matched then 
    insert default values 
output inserted.MyTreeElementID; 
+1

恐ろしいソース!もう一度救うためにマージ!トリックにマッチしないときにINSERT DEFAULT VALUESを実行するとは思わなかったし、すべての行を取得するために1 = 0を使う。生成されたIDをEntityIdTabに出力し、ItemIndexをID列にしたので、後で元のNodeTypeATabテーブルとの結合「相関ID」としてItemIndexを使用してNodeTypeATabIdを生成IDで更新することができます。 – soundslike

1

あなたは「配列は、」それは、SQL Serverのデナリで利用できるようになるだろう構築エミュレートしようとしているようですね、そこにSQL Server用のシーケンスソリューションの数は約掲載されている - しかし、あなたは知っておく必要があります結果を得るために検索する用語。

たとえば、次に示すのは、実行しようとしているものを提供するOracle SequencesのSQL Serverへの移行に関するSQL CATの記事です。システム全体、行の一意のIDをgetttingにかなり標準のルートとなっている - を検討する

http://blogs.msdn.com/b/sqlcat/archive/2006/04/10/sql-server-sequence-number.aspx

代替は、固有のIDを取得するために、GUIDのを使用することです。

+0

ありがとうございました - 前にSequenceの構造について聞いたことがありませんでした。 – soundslike

関連する問題