Quantcast
Channel: dBforums – Everything on Databases, Design, Developers and Administrators
Viewing all articles
Browse latest Browse all 13329

OUTPUT INSERTED INTO can't get column value when that column is not inserted

$
0
0
Hi,

I'm doing a data migration job from our old to our new database. The idea is that we don't want to clutter our new tables with the id's of the old tables, so we are not going to add a column "old_system_id" in each and every table that needs to be migrated.

I have created a number of tables in a separate schema "dm" (for Data Migration) that will store the link between the old database table and the new database table. Suppose that the id of a migrated record in the old database is 'XRP002-89' and during the insert into the new table the IDENTITY column id gets the value 1, the link table will hold : old_d = 'XRP002-89', new_id = 1, and so on.

I knew I can get the value of IDENTITY columns with the OUTPUT INTO clause, although I have never actually used it. And now I can't get it to do what I need.

Below is some code to set up three tables: the old table, the new one, and the table that will hold the link between the id's of records in the old database table and the new database table.
Code:

CREATE TABLE DaOldTable(
        pk                CHAR(10)        NOT NULL,
        a_column        CHAR(10)
)

CREATE TABLE DaNewTable(
        id                INT        NOT NULL        IDENTITY,
        a_column        CHAR(10)
)

CREATE TABLE link_old2new_DaTable(
        DaOld_id        CHAR(10)        NOT NULL,
        DaNew_id        INT        NOT NULL
)

INSERT INTO DaOldTable(pk, a_column) VALUES
('1st rec', 'first rec'),
('2nd rec', 'second rec'),
('Nth rec', 'last rec')

SELECT * FROM DaOldTable
--pk                a_column
--1st rec        first rec
--2nd rec        second rec
--Nth rec        last rec

Below I tried to use the OUTPUT INSERTED INTO clause. Beside getting the generated IDENTITY value, I also need to capture the value of the old id that will not be migrated to the new table. When I use "OUTPUT DaOldTable.pk" the system gives me the error: "The multi-part identifier "DaOldTable.pk" could not be bound." Using INSERTED .id gives no problem.
Code:

INSERT INTO DaNewTable(a_column)
--OUTPUT DaOldTable.pk, INSERTED.id link_old2new_DaTable--(DaOld_id, DaNew_id)
SELECT a_column
FROM DaOldTable

SELECT * FROM DaNewTable
--id        a_column
--1        first rec
--2        second rec
--3        last rec 

SELECT * FROM link_old2new_DaTable
--Expected result in link_old2new_DaTable
--DaOld_id        DaNew_id
--1st rec        1
--2nd rec        2
--Nth rec        3

--but getting "The multi-part identifier "DaOldTable.pk" could not be bound."

DROP TABLE DaOldTable
DROP TABLE DaNewTable
DROP TABLE link_old2new_DaTable

How can I populate a table that must hold the link between the id's of records in the old database table and the new database table? The records are migrated with set-based inserts.

Viewing all articles
Browse latest Browse all 13329

Trending Articles