1

私は SQL Server 2K8 を使用しており、主キーが複数のテーブルで一意になるように ID を生成するためだけに使用されるテーブルを持っています。タイプ。

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

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

また、while ループ/カーソルを使用できることはわかっていますが、SQL バッチ ステートメントを使用してこのテーブルから ID を取得し、実際のテーブルに挿入する前に一時テーブルに設定できるかどうか、行データの一時テーブルが与えられているかどうか疑問に思っていました。テーブル。

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
4

2 に答える 2

1

SQL Server Denaliで利用できるようになる「Sequence」構造をエミュレートしようとしているようです。SQLServer用のSequenceソリューションが多数投稿されていますが、検索する用語を知っておく必要があります。結果。

たとえば、以下は、Oracle Sequences(実行しようとしていることを提供する)のSQLServerへの移行に関連するSQLCATの記事です。

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

検討する別の方法は、GUIDを使用して一意のIDを取得することです。これは、システム全体で行の一意のIDを取得するためのかなり標準的なルートです。

于 2011-10-20T21:22:18.440 に答える
1

生成された ID をどこに配置したいかはわかりませんが、マージと数値テーブルを使用して一度に複数の ID を生成できます。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;  
于 2011-10-20T21:18:50.617 に答える