sql >> Database >  >> RDS >> Sqlserver

Hoe kan ik met SSIS een groot plat bestand in een databasetabel laden?

Ervan uitgaande dat u SQL Agent (of vergelijkbare planner) gebruikt

Reqs 1/4) Ik zou een voorloperstap de FTP- en/of bestandskopieerstappen laten afhandelen. Ik hou er niet van om mijn pakketten vol te proppen met bestandsmanipulatie als ik het kan vermijden.

Vereisten 2/3) Op het niveau van de controlestroom zal het pakketontwerp eruitzien als een SQL-taak uitvoeren die is verbonden met een gegevensstroom die is verbonden met een andere SQL-taak uitvoeren. Zoals @AllenG aangaf, kunt u het beste via de taak Gegevensstroom in een verzameltabel laden. De eerste Execute SQL Task verwijdert alle rijen uit de staging-tabel (TRUNCATE TABLE dbo.DAILY_STAGE)

Het geschatte tafelontwerp ziet er als volgt uit. De tabel MICHAEL_BORN is uw bestaande tabel en de DAILY_STAGE is waar uw gegevensstroom terechtkomt.

CREATE TABLE DBO.MICHAEL_BORN
(
    ID int identity(1,1) NOT NULL PRIMARY KEY CLUSTERED
,   ItemID int NOT NULL
,   ItemName varchar(20) NOT NULL
,   ItemType varchar(20) NOT NULL
)
CREATE TABLE dbo.DAILY_STAGE
(
    ItemID int NOT NULL PRIMARY KEY CLUSTERED
,   ItemName varchar(20) NOT NULL
,   ItemType varchar(20) NOT NULL
)

Voor demonstratiedoeleinden laad ik de bovenstaande tabellen met voorbeeldgegevens via TSQL

-- Original data
INSERT INTO
    dbo.MICHAEL_BORN
VALUES
    (2345,'Apple','Fruit')
,   (4578, 'Bannana','Fruit')


-- Daily load runs
-- Adds a new fruit (pear), corrects misspelling of banana, eliminates apple
INSERT INTO
    dbo.DAILY_STAGE
VALUES
    (7721,'Pear','Fruit')
,   (4578, 'Banana','Fruit')

De taak SQL uitvoeren maakt gebruik van de MERGE statement beschikbaar in 2008+ edities van SQL Server. Let op:de achterste puntkomma maakt deel uit van de MERGE-instructie. Als u dit niet opneemt, krijgt u de foutmelding "Een MERGE-instructie moet worden afgesloten met een puntkomma (;)."

-- MERGE statement
-- http://technet.microsoft.com/en-us/library/bb510625.aspx
-- Given the above scenario, this script will
-- 1)  Update the matched (4578 bannana/banana) row
-- 2)  Add the new (pear) row
-- 3)  Remove the unmatched (apple) row

MERGE
    dbo.[MICHAEL_BORN] AS T
USING
(
    SELECT
        ItemID
    ,   ItemName
    ,   ItemType
    FROM
        dbo.DAILY_STAGE

) AS S
ON T.ItemID = S.ItemID
WHEN
    MATCHED THEN
    UPDATE
    SET
        T.ItemName = S.ItemName
    ,   T.ItemType = S.ItemType
WHEN
    NOT MATCHED THEN
    INSERT
    (
        ItemID
    ,   ItemName
    ,   ItemType
    )
    VALUES
    (
        ItemID
    ,   ItemName
    ,   ItemType
    )
WHEN
    NOT MATCHED BY SOURCE THEN
    DELETE
    ;

Req 5) Efficiëntie is volledig gebaseerd op uw gegevens en hoe breed uw rijen zijn, maar het zou niet verschrikkelijk moeten zijn.

-- Performance testing
-- Assumes you have a similar fast row number generator function
-- http://billfellows.blogspot.com/2009/11/fast-number-generator.html

TRUNCATE TABLE dbo.MICHAEL_BORN
TRUNCATE TABLE dbo.DAILY_STAGE

-- load initial rows
-- 20ish seconds
INSERT INTO
    dbo.MICHAEL_BORN
SELECT
    N.number AS ItemID
,   'Spam & eggs ' + CAST(N.number AS varchar(10)) AS ItemName
,   'SPAM' AS ItemType
--, CASE N.number % 2 WHEN 0 THEN N.number + 1000000 ELSE N.number END AS UpTheEvens
FROM
    dbo.GenerateNumbers(1000000) N


-- Load staging table
-- Odds get item type switched out
-- Evens get delete and new ones created
-- 20ish seconds
INSERT INTO
    dbo.DAILY_STAGE
SELECT
    CASE N.number % 2 WHEN 0 THEN N.number + 1000000 ELSE N.number END AS ItemID
,   'Spam & eggs ' + CAST(N.number AS varchar(10)) AS ItemName
,   CASE N.number % 2 WHEN 0 THEN 'SPAM' ELSE 'Not much spam' END AS ItemType
FROM
    dbo.GenerateNumbers(1000000) N


-- Run MERGE statement, 32 seconds 1.5M rows upserted
-- Probably fast enough for you


  1. Oproep naar een lidfunctie addEagerConstraints() op float LARAVEL

  2. Wat is een oplossing van Multiple ResultSets zijn geretourneerd door de query?

  3. Is er een manier om informatie te krijgen over de huidige sessie van gv$session in Oracle?

  4. Hoe mysql root-wachtwoord te herstellen in MacOS