将数据插入到几个表中

时间:2010-05-13 13:52:12

标签: sql sql-server tsql

让我们说我有一张桌子(一切都非常简化):

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我没有问题,但我不知道如何根据这一组进行设置(即在两个表中输入几行)。

感谢。

祝福,

基督教

3 个答案:

答案 0 :(得分:1)

另一种可能阻止使用游标的方法(通常不是SQL的最佳实践)如下所示...它使用OUTPUT子句捕获插入中使用的一个表的插入结果到第二个表。

请注意,此示例假设我将IDENTITY列移动到Items表。我相信这是可以接受的,至少基于你原来的表格布局,因为该表的主键是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

答案 1 :(得分:0)

您需要编写一个ETL过程来执行此操作。您可能想要研究SSIS。

这也可以使用t-sql和可能的临时表来完成。您可能需要在Statements表中存储来自OriginalTable的唯一键,然后在插入Items时 - 将OriginalTable与该唯一键上的Statements连接以获取ID。

答案 2 :(得分: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