我有旧桌子 项目(vendorId-FK,ManufacturerId(不是FK)), 供应商(PK-VendorId int), 制造商(PK-ManufacturerId int) 需要将数据传输到新数据库并且它适用于从供应商传输数据,但是从制造商传输数据仅为30000(其中oldManufacturerId不为空),而其他5000不传输。我有什么想法吗?
新表制造商 (OldManufacturerID int, newManufacturerId Uniqueidentifier默认newid(), ManufacturerName varchar(100),
)
新表项目 (... 商品描述, ManufacturerId uniqueidentifier, VendorId uniqueidentifier )
INSERT INTO dbo.Item
( ...
ItemDescription,
ManufacturerId ,
VendorId
)
SELECT
...
itemDescription,
m.ManufacturerId ,
v.VendorId
FROM OldSqlDatabase.dbo.tbl_Items i
JOIN NewSqlDatabase.dbo.Vendor v ON ISNULL(i.vendor_id, '') = ISNULL(v.SourceVendorID, '')
JOIN NewSqlDatabase.dbo.Manufacturer m ON ISNULL(i.manufacturer_id, '') = ISNULL(m.SourceManufacturerID, '')
我刚刚传输了一个数据,因为这个表没有任何关系,new manufacturerId有默认的newid(),而这个新的id我想在新的item表中使用 插入dbo.Manufacturer (OldManufacturerID, 生产商名称 , ) 选择 manufacturer_id, 生产商名称 , 来自oldManufacture
答案 0 :(得分:1)
您可能需要使用LEFT JOIN获取记录,其中没有要加入的值(空值)。 LEFT JOIN将允许您选择连接中指定的第一个表中的所有记录,即使连接中的第二个表中没有可用的匹配记录。
这也可以让你摆脱连接定义中的ISNULL()
内容。那些表现非常糟糕,因为他们无法使用索引。
我会建议像:
INSERT INTO dbo.Item
( ...
ItemDescription,
ManufacturerId ,
VendorId
)
SELECT
...
itemDescription,
m.ManufacturerId ,
v.VendorId
FROM OldSqlDatabase.dbo.tbl_Items i
LEFT JOIN NewSqlDatabase.dbo.Vendor v
ON i.vendor_id = v.SourceVendorID
LEFT JOIN NewSqlDatabase.dbo.Manufacturer m
ON i.manufacturer_id = m.SourceManufacturerID