2011-10-20 24 views
1

我正在使用SQL Server 2K8,並且只有一個表用於生成標識,以便主鍵在多個表中唯一 - 跨多個表的唯一性適用於元素hiearchy樹,無論何種類型,都要求每個節點都有唯一的ID。從臨時表中輸出多個標識列

它只有一個自動增量標識列,我通常使用@@ IDENTITY來提取ID,如果我要逐一插入一條記錄。但是,我試圖優化和批量插入,但首先需要從該表中生成一批ID。

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

而且我知道我可以使用while循環/光標,但不知道是否給定行數據的臨時表,如果我可以使用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的,但你可以使用合併和numbers table來一次生成多個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; 
+1

棒極了! MERGE再次拯救這一天!我不認爲在不匹配技巧時使用INSERT DEFAULT VALUES,並使用1 = 0來獲取所有行。我還將生成的id輸出到EntityIdTab中,並將ItemIndex作爲標識列,以便我稍後可以使用它作爲與其ItemIndex上的原始NodeTypeATab表的聯合「correlation id」,以使用生成的id更新它的NodeTypeATabId。 – soundslike

1

這聽起來像你正試圖效仿「序列」構建將是在SQL Server Denali車型提供,還有一些用於SQL Server序列解決方案的發佈各地 - 但你需要知道用於搜索以獲得結果。

例如,以下是與SQL Server遷移Oracle序列(提供您正在嘗試執行的操作)有關的SQL CAT文章。

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

另一種考慮是使用GUID的得到一個唯一的ID - 這一直流汗唯一的ID對行,在整個系統中的相當標準的路線。

+0

謝謝 - 我之前沒聽說過Sequence構造。 – soundslike