У меня есть старая таблица с множеством столбцов, которые я хочу разделить на 3 таблицы со связями между многими.
В старой таблице нет столбца идентификаторов.
Старый стол:
CustomerNumber
FirstName
LastName
Address
Postal
City
....
Новые таблицы
Заказчик:
Id
Customernumber
Firstname
Lastname
... ect
Адрес:
Id
Address
Postal
City
... ect
CustomerAddress
Id
CustomerId
AddressId
Теперь, как я могу использовать старые табели в новые, используя SQL?
Я пробовал с MERGE, но он не может обрабатывать более одной таблицы одновременно. Одним из вариантов является использование CURSOR, но я читал, что это плохая идея - использовать это или итерацию, но пока это единственное решение, которое я нашел для этого.
declare
@CustomerId bigint,
@CustomerNumber float,
@Status int,
@Address varchar(50),
@RoadNumber int,
@LastEdited datetime,
@AddressId bigint
declare my_cursor cursor
local static read_only forward_only
for
select CustomerNumber, Address, Housenumber, Status, Date
from [db1].dbo.OldCustomer k
where
FIRMANR in (1, 40, 60, 80, 90, 120, 180, 400)
open my_cursor
fetch next from my_cursor into @CustomerNumber, @Address, @RoadNumber, @Status, @LastEdited
while @@FETCH_STATUS = 0
begin
--if the customer already exists we get the identity
if exists (select Id from [db2].dbo.Customers where CustomerNumber = @CustomerNumber)
select @CustomerId = Id from [db2].dbo.Customers where CustomerNumber = @CustomerNumber
--if the customer does not exit we need to insert and retrieve the new Identity value
else
begin
-- insert the customer
insert into [db2].dbo.Customers (CustomerNumber, [Status], LastEdited) values (@CustomerNumber, @Status, @LastEdited)
set @CustomerId = SCOPE_IDENTITY()
end
-- get address if it already exists
if exists (select Id from [db2].dbo.Addresses where Road = @Address and Roadnumber = @RoadNumber)
select @AddressId = Id from [db2].dbo.Addresses where Road = @Address and Roadnumber = @RoadNumber
else
begin
-- insert new addresses
insert into [db2].dbo.Addresses (Road,Roadnumber) values (@Address, @RoadNumber)
set @AddressId = SCOPE_IDENTITY()
end
-- insert customer => address reference if it does not exist
if not exists (select Id from [db2].dbo.CustomerAddress where CustomerId = @CustomerId and AddressId = @AddressId)
-- insert customer => address reference
insert into [db2].dbo.CustomerAddress(CustomerId,AddressId) values (@CustomerId, @AddressId)
fetch next from my_cursor into @CustomerNumber, @Address, @RoadNumber, @Status, @LastEdited
end
close my_cursor
deallocate my_cursor