Я действительно очень хочу использовать INSERT, вложенный в SELECT - PullRequest
0 голосов
/ 02 декабря 2009

Я знаю, что это задача, которая не может быть уникальной, но я не могу найти способ сделать то, что я думаю, в моих поисках и чтении, поэтому, если это невозможно, я бы хотел знаю, выбираю ли я лучшую альтернативу.

Простой случай перемещения информации о людях из старой базы данных в новую. Проблема в том, что старая схема имеет адрес в каждой строке, и мы разбиваем его на его собственную таблицу адресов для новой.

То, что я хочу сделать, выглядит примерно так:

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 голосов
/ 02 декабря 2009

Звучит так, как будто вы ищете ВЫБРАТЬ В

1 голос
/ 03 декабря 2009

Вы также можете использовать курсор, что-то вроде этого может быть:

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
1 голос
/ 02 декабря 2009

Я бы попробовал что-нибудь, используя табличную переменную для перемещения данных

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
0 голосов
/ 02 декабря 2009

да, вы должны сначала получить адреса в & затем сопоставить, чтобы назначить идентификаторы при вставке записей о людях.

т.е. Вы не можете сделать вставку в подзапросе.

...