使用递增的ID为链接表创建INSERT脚本(SQL服务器)

时间:2016-06-13 15:21:33

标签: sql sql-server

我有一个常规任务,涉及从一个数据库导出两个表,并将数据导入另一个数据库,其对应的表不为空。其中一个表有一个列,它引用第一个的ID。让我们称之为Customer和Customer_Address,其中Customer_Address的Customer_ID列引用Customer表中的ID。

我需要为这些创建一个导入脚本,它会将Customer记录添加到另一个非空DB,每行ID = max(id)+1,而不会断开与另一个表的链接。 Customer_Address表同样具有自己的ID列,需要以相同的方式递增。

我并不需要让第一个插入的记录比现有的最高ID高一个,但这是最好的。我过去曾设法手动检查目标数据库中的最高ID,并使用搜索和替换以及导入脚本中的变量添加此数字,但是如果有任何记录添加到目标数据库在过渡期间。

我还有另一种方法,包括选择,复制,粘贴和SQL包装选择的所有列,但使用Excel从源表中使用ID并使用select(max)而不是ID,但它又相当繁琐。< / p>

使用数据进行修改 用于创建源表和目标表的示例脚本(为方便起见,在相同的/ temdb数据库中)位于: http://pastebin.com/C64wFtsP

应该输出如下:

select * from customer
id  Last    First
1   Johnson James
2   Kelly   Karl
3   Lawlor  Liam
select * from customer2
id  Last    First
1   Adams   Ann
2   Byrne   Bressie
3   Casey   Charlene
select * from customeraddress
id  idclient street         city        county  country
1   1       65 North St.    Marcoussin  Jojoba  Flatland
2   2       42 South St.    Marcoussin  Jojoba  Flatland
3   3       12 West St.     Marcoussin  Jojoba  Flatland
4   1       17 East St.     Marcoussin  Jojoba  Flatland
5   1       75 Centre St.   Marcoussin  Jojoba  Flatland
select * from customeraddress2
id  idclient street         city        county  country
1   1       99 North St.    Marcoussin  Jojoba  Flatland
2   2       88 South St.    Marcoussin  Jojoba  Flatland
3   3       88 West St.     Marcoussin  Jojoba  Flatland
4   1       66 East St.     Marcoussin  Jojoba  Flatland
5   1       55 Centre St.   Marcoussin  Jojoba  Flatland

我正在寻找的是一种将两个源表中的数据导入到相应目标表的脚本的方法,同时保留了customeraddress中的idclient与客户中的id之间的链接。

1 个答案:

答案 0 :(得分:0)

如果您可以在目标数据库中暂存数据,请执行以下操作:

  1. 在目的地,所有字段中对两个表进行分级。
  2. 将用户插入新的目标表。
  3. 写一个这样的查询
  4. 请注意,您需要为您的客户识别一个自然密钥(使其成为Customer1中也存在于Customer2中的不同实体的东西) - firstName,lastName可能不是最好的,因为它们极不可能在您的客户群中有所区别,但这是您在样本数据中得到的。

    INSERT INTO customeraddress2
    SELECT
      customer2.id,
        staged_customeraddress1.street,
        staged_customeraddress1.city,
        staged_customeraddress1.county,
        staged_customeraddress1.country
    FROM customer2
    JOIN staged_customer1
        ON staged_customer1.firstName = customer2.firstName
        AND staged_customer1.lastName = customer2.lastName
    JOIN staged_customeraddress1
        ON staged_customeraddress1.idclient = staged_customer1.id