我知道这是一项不可能独一无二的任务,但我似乎找不到办法在我的搜索和阅读中做我正在考虑的事情,所以如果不可能,我想知道我是否选择了最好的选择。
将人们从旧数据库移动到新数据库的简单案例。问题是旧模式在每一行都有地址,我们将它分解为新的地址表。
我想要做的事情是这样的:
INSERT INTO [newDB].[dbo].[Persons] ([FirstName], [LastName], [AddressId], [SSN])
SELECT
p.[Firstname],
p.[Lastname],
AddressId =
(
-- The result of inserting the address into the
-- table or the existing address' ID
),
p.[SSN]
FROM [oldDB].[dbo].[tblPersons] p
有没有办法做到我无法找到的,或者我应该首先获取地址然后匹配,还是我完全遗漏的东西?任何帮助都将受到赞赏,这是我第一次不得不努力将其他人的数据推向前进,而我的无根据的乐观情绪将不会再延长。 ;)
答案 0 :(得分:4)
听起来你正在寻找的是SELECT INTO
答案 1 :(得分:1)
我会尝试使用表格var来移动数据
DECLARE @OldTable TABLE(
PersonID INT,
FirstName VARCHAR(50),
LastName VARCHAR(50),
Address1 VARCHAR(50),
Address2 VARCHAR(50)
)
INSERT INTO @OldTable (PersonID,FirstName,LastName,Address1,Address2) SELECT 1, 'A', 'B', 'C', 'D'
SELECT *
FROM @OldTable
DECLARE @Persons TABLE(
PersonID INT,
FirstName VARCHAR(50),
LastName VARCHAR(50),
AddressID INT
)
DECLARE @Addresses TABLE(
AddressID INT,
Address1 VARCHAR(50),
Address2 VARCHAR(50)
)
DECLARE @TempTable TABLE(
PersonID INT,
AddressID INT IDENTITY(1,1),
Address1 VARCHAR(50),
Address2 VARCHAR(50)
)
INSERT INTO @TempTable (PersonID,Address1,Address2) SELECT PersonID,Address1,Address2 FROM @OldTable
INSERT INTO @Addresses (AddressID,Address1,Address2)
SELECT AddressID,
Address1,
Address2
FROM @TempTable
INSERT INTO @Persons (PersonID,FirstName,LastName,AddressID)
SELECT ot.PersonID,
ot.FirstName,
ot.LastName,
t.AddressID
FROM @OldTable ot INNER JOIN
@TempTable t ON ot.PersonID = t.PersonID
SELECT *
FROM @Persons
SELECT *
FROM @Addresses
答案 2 :(得分:1)
您也可以使用光标,可能是这样的:
DECLARE @AddressID INT
DECLARE @Address VARCHAR(50)
DECLARE @FirstName VARCHAR(50)
DECLARE @LastName VARCHAR(50)
DECLARE cur CURSOR FOR
SELECT FirstName, LastName, Address
FROM olddb.dbo.tblPersons
OPEN cur
FETCH NEXT FROM cur INTO @FirstName, @LastName, @Address
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO newdb.dbo.Address(Address)
VALUES(@Address)
SET @AddressID = @@IDENTITY
INSERT INTO newdb.dbo.Persions(FirstName, LastName, AddressID)
VALUES(@FirstName, @LastName, @AddressID)
FETCH NEXT FROM cur INTO @FirstName, @LastName, @Address
END
CLOSE cur
DEALLOCATE cur
答案 3 :(得分:0)
即。你不能在子查询中插入。