I have a large (5 million rows, 300+ columns) csv file that I need to import into a staging table on SQL Server, then run a script to split each row up and paste the data into the corresponding tables in a normalized db. The format of the source table looks something like this:
(fName, lName, licenseNumber1, licenseIssuer1, licenseNumber2, licenseIssuer2..., specialtyName1, specialtyState1, specialtyName2, specialtyState2..., identifier1, identifier2...)
There are 50 columns licenseNumber/licenseIssuer, columns 15 specialtyName/specialtyStateand 15 identifier. There is always at least one of them, but the remaining 49 or 14 may be null. The first identifier is unique, but not used as the primary key of the Person in our scheme.
My database schema is as follows
People(ID int Identity(1,1))
Names(ID int, personID int, lName varchar, fName varchar)
Licenses(ID int, personID int, number varchar, issuer varchar)
Specialties(ID int, personID int, name varchar, state varchar)
Identifiers(ID int, personID int, value)
The database will already be filled with some Peoplebefore adding new ones from csv.
?
select top 1:
WHILE EXISTS (Select top 1 * from staging)
BEGIN
INSERT INTO People Default Values
SET @LastInsertedID = SCOPE_IDENTITY()
INSERT INTO Names (personID, lName, fName)
SELECT top 1 @LastInsertedID, lName, fName from staging
INSERT INTO Licenses(personID, number, issuer)
SELECT top 1 @LastInsertedID, licenseNumber1, licenseIssuer1 from staging
IF (select top 1 licenseNumber2 from staging) is not null
BEGIN
INSERT INTO Licenses(personID, number, issuer)
SELECT top 1 @LastInsertedID, licenseNumber2, licenseIssuer2 from staging
END
DELETE top 1 from staging
END
, , . , 300 Fetch INTO.
, ? , , , , INSERT People , - .
, ""? :
FETCH INTO ...@LicenseNumber1, @LicenseIssuer1, @LicenseNumber2, @LicenseIssuer2...
INSERT INTO
(@LicenseNumber1, @LicenseIssuer1),
(@LicenseNumber2, @LicenseIssuer2),
... Repeat 48 more times...
.
.
.
INSERT INTO Licenses(personID, number, issuer)
SELECT @LastInsertedID, number, issuer
FROM
WHERE number is not null
, - .
, :
, , .