我真的很想使用嵌套在SELECT中的INSERT

时间:2009-12-02 06:16:25

标签: tsql sql-server-2008 data-migration

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

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

想要做的事情是这样的:

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 个答案:

答案 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)

是的,你应该首先获得&然后匹配以在插入人员记录时分配ID。

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