迁移数据时创建父子关系(sql server 2008)

时间:2014-03-28 06:16:24

标签: sql sql-server

背景

我正在从客户端迁移数据,它们采用csv格式。我导入了临时数据库中的所有数据,到目前为止一直很好。

立即

我需要使用一系列脚本将此数据从此临时数据库移动到使用sql脚本的另一个数据库。

像往常一样,这些数据没有正确的主键和外键,所以我可以创建某种关系

让我们举个例子给出2个表Customer和CustomerOrder如何插入/创建两者之间的关系? 如何将customer表中的Id插入CustomerOrder表?

我必须为很多桌子做这个,所以我想建立一种方法!

        IF object_id(N'Customer', 'U') IS NOT NULL
            DROP TABLE Customer

        GO
        CREATE TABLE [dbo].[Customer](
            [Id] [bigint] IDENTITY(1,1) NOT NULL,
            [Name] [varchar](50) NULL,
            [Surname] [varchar](50) NULL,
         CONSTRAINT [PK_Customer] PRIMARY KEY CLUSTERED 
        (
            [Id] ASC
        )
        ) ON [PRIMARY]


        IF object_id(N'CustomerOrder', 'U') IS NOT NULL
            DROP TABLE CustomerOrder

        GO
        CREATE TABLE [dbo].[CustomerOrder](
            [Id] [bigint] IDENTITY(1,1) NOT NULL,
            [CustomerId] [bigint] NOT NULL,
            [OrderNo] [bigint] NULL,
            [OrderName] [varchar](50) NOT NULL,
         CONSTRAINT [PK_CustomerOrder] PRIMARY KEY CLUSTERED 
        (
            [Id] ASC
        )
        ) ON [PRIMARY]

尝试将数据从登台数据库插入mydb

        Insert MyDatabase.dbo.Customer
        (   --Id - this column value is auto-generated
            Name,
            Surname
        )
        Select Name,Surname
        from StagingDatabase.dbo.Customer

        INSERT MyDatabase.dbo.CustomerOrder
        (
            --Id - this column value is auto-generated
            CustomerId,
            OrderNo,
            OrderName
        )
        SELECT CustomerId=???,OrderNo,OrderNo
        FROM StagingDatabase

当您遇到不良数据并且需要创建和插入父/子数据时,您是如何做到的?

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

填充Customer表。(这些查询假定自动生成的主键)。

insert into Customer (Name,Surname)
    select Name,Surname from staging_table;

填充CustomerOrders表。使用非主键字段加入Customer以获取主键。

insert into CustomerOrders (CustomerId,OrderNo,OrderName)
    select cust.Id, OrderNo, OrderName
        from staging_table staging
        join Customer cust on
            cust.Name    = staging.Name and
            cust.Surname = staging.Surname;

加入唯一标识客户所需的所有字段。显然,单凭名称通常是不够的,但我认为这只是一个例子。

此外,如果任何字段可以为null,则必须在加入时特别处理。否则,将省略具有空值的行:

 join customer cust on
    coalesce(cust.Name,'**NULL**') = coalesce(staging.Name,'**NULL**') and
    ... etc. ...

coalesce中使用的字符串并不重要,只要它不会出现在实际数据中。