2010-05-13 67 views
0

讓我們說我有一個表(一切都非常簡單):將數據插入到幾個表

create table OriginalData (
ItemName NVARCHAR(255) not null 
    ) 

而且我想插入它的數據(基於集合!)爲兩個表哪種模式繼承

create table Statements (
     Id int IDENTITY NOT NULL, 
ProposalDateTime DATETIME null 
    ) 

create table Items (
     StatementFk INT not null, 
     ItemName NVARCHAR(255) null, 
     primary key (StatementFk) 
    ) 

語句是父表,而Items是子表。我在使用IDENT_CURRENT的一行做這個沒有問題,但我不知道如何做這個基於(即在兩個表中輸入多行)。

謝謝。

最良好的祝願,

基督教

+2

我有什麼你正在嘗試做的沒有真正的想法。 OriginalData中的列如何映射到Statements和Items表? – 2010-05-13 14:14:30

+0

對不起KM我編輯過它 - 現在應該是有道理的。 – cs0815 2010-05-13 14:18:30

+0

順便說一句,從來沒有使用ident_current它會給插入的lastidentity可能不是你的,我們有一個dev完全搞砸了數據完整性使用這個時,兩個不同的用戶在同一時間插入。 – HLGEM 2010-05-13 21:23:56

回答

1

另一種可能的方法,將阻止使用遊標,這通常不是一個最好的做下面列出了SQL練習,它使用OUTPUT子句從插入到第二個表中的一個表中捕獲插入結果。

注意這個例子使得在我搬到你的身份列在項目表的事實一個假設。我相信這是可以接受的,至少基於你原來的表格佈局,因爲該表的主鍵是StatementFK列。

注意此示例代碼通過SQL 2005進行了測試...


IF OBJECT_ID('tempdb..#OriginalData') IS NOT NULL 
    DROP TABLE #OriginalData 
IF OBJECT_ID('tempdb..#Statements') IS NOT NULL 
    DROP TABLE #Statements 
IF OBJECT_ID('tempdb..#Items') IS NOT NULL 
    DROP TABLE #Items 

create table #OriginalData 
(ItemName NVARCHAR(255) not null) 

create table #Statements 
(Id int NOT NULL, 
    ProposalDateTime DATETIME null) 

create table #Items 
(StatementFk INT IDENTITY not null, 
    ItemName NVARCHAR(255) null, 
    primary key (StatementFk)) 

INSERT INTO #OriginalData 
    (ItemName ) 
      SELECT 'Shirt' 
UNION ALL SELECT 'Pants' 
UNION ALL SELECT 'Socks' 
UNION ALL SELECT 'Shoes' 
UNION ALL SELECT 'Hat' 

DECLARE @myTableVar table 
    (StatementFk int, 
    ItemName nvarchar(255)) 

INSERT INTO #Items 
    (ItemName ) 
OUTPUT INSERTED.StatementFk, INSERTED.ItemName 
INTO @myTableVar 
SELECT ItemName 
FROM #OriginalData 

INSERT INTO #Statements 
    (ID, ProposalDateTime ) 
SELECT 
    StatementFK, getdate() 
FROM @myTableVar 
+0

如果您正在使用可以使用它的SQL Server厭惡性,OUTPUT是首選的方法。 – HLGEM 2010-05-13 21:24:52

0

你需要寫一個ETL過程做到這一點。你可能想看看SSIS。

這也可以用t-sql和可能的臨時表來完成。您可能需要將來自OriginalTable的唯一密鑰存儲在Statements表中,然後在插入Items時 - 將OriginalTable與Statements結合在該唯一密鑰上以獲取ID。

0

我不認爲你能做到這一點的一個塊,但你當然可以用遊標循環

DECLARE @bla char(10) 
DECLARE @ID int 

DECLARE c1 CURSOR 
FOR 
SELECT bla 
FROM OriginalData 

OPEN c1 

FETCH NEXT FROM c1 
INTO @bla 

WHILE @@FETCH_STATUS = 0 
BEGIN 

    INSERT INTO Statements(ProposalDateTime) VALUES('SomeDate') 
     SET @ID = SCOPE_IDENTITY() 
     INSERT INTO Items(StateMentFK,ItemNAme) VALUES(@ID,@bla) 
    FETCH NEXT FROM c1 
    INTO @bla 

END 

CLOSE c1 
DEALLOCATE c1 
+0

感謝這似乎很好地工作 - 有一段時間沒有使用光標 – cs0815 2010-05-13 14:27:40