【问题标题】:How should I migrate this data into these Sql Server tables?我应该如何将这些数据迁移到这些 Sql Server 表中?
【发布时间】:2010-10-18 11:42:11
【问题描述】:

我希望将一些数据从一个表迁移到这三个新表中。

这是我的目标架构:

请注意,我需要插入第一个 Location 表 .. 获取 SCOPE_IDENTITY() .. 然后将行插入到 BoundaryCountry 表中。

SCOPE_IDENTITY() 正在杀死我 :( 意思是,我只能通过 CURSORS 看到一种方法。有更好的选择吗?

更新

这是 DB Schema 的脚本......

位置

CREATE TABLE [dbo].[Locations](
    [LocationId] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](100) NOT NULL,
    [OriginalLocationId] [int] NOT NULL,
 CONSTRAINT [PK_Locations] PRIMARY KEY CLUSTERED 
(
    [LocationId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) 

国家

CREATE TABLE [dbo].[Locations_Country](
    [IsoCode] [nchar](2) NOT NULL,
    [LocationId] [int] NOT NULL,
 CONSTRAINT [PK_Locations_Country] PRIMARY KEY CLUSTERED 
(
    [LocationId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[Locations_Country]  WITH CHECK ADD  CONSTRAINT [FK_Country_inherits_Location] FOREIGN KEY([LocationId])
REFERENCES [dbo].[Locations] ([LocationId])
GO

ALTER TABLE [dbo].[Locations_Country] CHECK CONSTRAINT [FK_Country_inherits_Location]
GO

边界

CREATE TABLE [dbo].[Boundaries](
    [LocationId] [int] NOT NULL,
    [CentrePoint] [varbinary](max) NOT NULL,
    [OriginalBoundary] [varbinary](max) NULL,
    [LargeReducedBoundary] [varbinary](max) NULL,
    [MediumReducedBoundary] [varbinary](max) NULL,
    [SmallReducedBoundary] [varbinary](max) NULL,
 CONSTRAINT [PK_Boundaries] PRIMARY KEY CLUSTERED 
(
    [LocationId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[Boundaries]  WITH CHECK ADD  CONSTRAINT [FK_LocationBoundary] FOREIGN KEY([LocationId])
REFERENCES [dbo].[Locations] ([LocationId])
GO

ALTER TABLE [dbo].[Boundaries] CHECK CONSTRAINT [FK_LocationBoundary]
GO

【问题讨论】:

    标签: sql sql-server tsql sql-server-2008 data-migration


    【解决方案1】:

    如果您按父/子关系的顺序处理数据,我认为不需要 SCOPE_IDENTITY 或游标:

    INSERT INTO LOCATION
      SELECT t.name,
             t.originallocationid
        FROM ORIGINAL_TABLE t
    GROUP BY t.name, t.originallocationid
    
    INSERT INTO COUNTRY 
    SELECT DISTINCT
           t.isocode,
           l.locationid
      FROM ORIGINAL_TABLE t
      JOIN LOCATION l ON l.name = t.name
                     AND l.originallocationid = t.originalocationid
    
    INSERT INTO BOUNDARY
    SELECT DISTINCT
           l.locationid,
           t.centrepoint,
           t.originalboundary,
           t.largereducedboundary,
           t.mediumreducedboundary,
           t.smallreducedboundary
      FROM ORIGINAL_TABLE t
      JOIN LOCATION l ON l.name = t.name
                     AND l.originallocationid = t.originalocationid
    

    【讨论】:

    • @OMG Ponies - 我不确定如何插入到 COUNTRY 表中,考虑到 PK 不是一个身份(注意继承 .. 即使这是一个类图而不是一个真正的数据库架构),而是一个 PK+FK。
    • @Pure.Krome:您在 COUNTRY 表中使用什么作为主键?原表中是否存在主键?
    • @OMG Ponies - 我将使用架构更新到 OP。 BRB 对此感到抱歉...
    • 叮!赢!不知道为什么我从没想过在名字和原始 ID 上链接......甜。干杯@OMG小马(再次):)
    【解决方案2】:

    加载您的 Location 表后,您可以创建一个查询,将 Location 与您的源单表连接起来。连接条件将是自然键(是 Name 列吗?),它将返回新的 LocationId 以及 Boundary 数据。结果将插入到新的边界表中。

    【讨论】:

    • 名称只存在于父表中:Location。两者之间的唯一连接是 LocationId PK / PK+FK。
    猜你喜欢
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 2018-10-26
    • 2021-02-21
    • 1970-01-01
    • 2019-11-07
    相关资源
    最近更新 更多