2010-05-13 72 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