0

我知道这是一项不可能独一无二的任务,但我似乎无法找到一种方法来做我在搜索和阅读中的想法,所以如果不可能,我想知道我是否我正在选择最好的选择。

将有关人员的信息从旧数据库移动到新数据库的简单案例。问题是旧模式的每一行都有地址,我们将其分解为新模式的自己的地址表。

想做的是这样的:

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

有没有办法做我无法找到的事情,或者我应该先输入地址然后匹配,或者我完全错过了什么?任何帮助都将不胜感激,这是我第一次不得不努力将其他人的数据向前推进,而我毫无根据的乐观情绪不会持续太久。;)

4

4 回答 4

4

听起来您正在寻找的是SELECT INTO

于 2009-12-02T06:18:30.827 回答
1

我会尝试使用 table 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
于 2009-12-02T06:30:24.363 回答
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
于 2009-12-02T23:44:31.617 回答
0

是的,您应该首先在 & 中获取地址,然后在插入人员记录时匹配以分配 ID。

即你不能在子查询中插入。

于 2009-12-02T06:25:47.443 回答