2011-02-25 29 views
0

我現在有這樣一個表:架構變化:轉換領域外鍵在不同的表

 
    Stuff 
    ---------- 
    StuffId identity int not null 
    Description nvarchar(4000) null 
    ... 

我要存儲在一個單獨的表的說明,我已經撥出專門爲生成用戶內容:

 
    Content 
    ---------- 
    ContentId identity int not null 
    Content nvarchar(max) not null 
    ... 

(該表已經存在,以及其他表已經在它的參考條目。)

所以我需要:

  1. 使用外鍵約束在Stuff表上創建DescriptionContentId字段。
  2. 將當前的描述內容複製到內容表中。
  3. 設置每個DescriptionContentId以具有在步驟2中插入值時自動生成的ContentId值。
  4. 刪除Description列。

我知道如何做第1步和第4步,但第2步和第3步都在逃避我,因爲它們需要幾乎同時完成。這似乎是一個相當常見的模式變化。什麼是最好的方式來做到這一點?

更新

我更近了一步得益於輸出關鍵字,但我仍然失去了一些東西。這是我想做什麼:

create table #tmp (StuffId int, ContentId int) 

insert into Content(Content) 
output s.StuffId, inserted.ContentId 
into #tmp(StuffId, ContentId) 
    select Description 
    from Stuff s 
    where Description IS NOT NULL 

但我不能引用s.StuffId,因爲它不是插入內容表中的字段之一。當我爲每個Stuff條目插入一個新的內容項目時,如何關聯Stuff的ID和內容的ID?

回答

1

輸出條款將幫助您解決。

它會將插入的描述和標識列輸出到表變量中,然後您可以使用該數據更新其他表。

如果描述不唯一,則可能需要執行以下操作: 將stuffID列的列添加到內容表中。然後從插入輸出填充和內容id,使用填充更新表以確保唯一性,從內容表中刪除填充列。

從聯機叢書爲例至於如何使用OUTPUT

DECLARE @MyTableVar table(
    LastName  nvarchar(20) NOT NULL, 
    FirstName nvarchar(20) NOT NULL, 
    CurrentSales money NOT NULL 
); 

INSERT INTO dbo.EmployeeSales (LastName, FirstName, CurrentSales) 
    OUTPUT INSERTED.LastName, 
     INSERTED.FirstName, 
     INSERTED.CurrentSales 
    INTO @MyTableVar 
    SELECT c.LastName, c.FirstName, sp.SalesYTD 
    FROM HumanResources.Employee AS e 
     INNER JOIN Sales.SalesPerson AS sp 
     ON e.EmployeeID = sp.SalesPersonID 
     INNER JOIN Person.Contact AS c 
     ON e.ContactID = c.ContactID 
    WHERE e.EmployeeID LIKE '2%' 
    ORDER BY c.LastName, c.FirstName; 
+0

優秀。看起來這是我失蹤的關鍵。我會努力工作,並讓你知道它是否有效。 – StriplingWarrior 2011-02-25 22:53:37

+0

不幸的是,我仍然被阻止。請參閱我的更新。 – StriplingWarrior 2011-02-25 23:09:49

+0

您必須暫時將stuffid添加到內容表中才能進行轉換。見上文第3段。是的,就是這樣。 – HLGEM 2011-02-28 14:41:52