Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak załadować duży plik płaski do tabeli bazy danych za pomocą usług SSIS?

Zakładając, że używasz agenta SQL (lub podobnego harmonogramu)

Reqs 1/4) Chciałbym, aby krok prekursora obsługiwał kroki FTP i/lub kopiowanie plików. Nie lubię zaśmiecać moich pakietów manipulacją plikami, jeśli mogę tego uniknąć.

Wymagania 2/3) Na poziomie przepływu sterowania projekt pakietu będzie wyglądał jak zadanie Execute SQL połączone z przepływem danych połączonym z innym zadaniem Execute SQL. Jak wskazał @AllenG, najlepiej będzie, jeśli załaduje się do tabeli pomostowej za pomocą zadania Przepływ danych. Pierwsze wykonanie zadania SQL usunie wszystkie wiersze z tabeli pomostowej (TRUNCATE TABLE dbo.DAILY_STAGE)

Przybliżony projekt stołu wygląda tak. Tabela MICHAEL_BORN to Twoja istniejąca tabela, a DAILY_STAGE to miejsce, w którym nastąpi przepływ danych.

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
)

W celach demonstracyjnych załaduję powyższe tabele przykładowymi danymi przez 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')

Zadanie Execute SQL będzie korzystać z MERGE oświadczenie dostępne w wersjach 2008+ SQL Server. Pamiętaj, że końcowy średnik jest częścią instrukcji MERGE. Nieuwzględnienie go spowoduje błąd „Oświadczenie MERGE musi być zakończone średnikiem (;).”

-- 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
    ;

Wymaganie 5) Wydajność jest całkowicie oparta na twoich danych i szerokości twoich wierszy, ale nie powinno to być straszne.

-- 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server 2008 Uruchamianie wyzwalacza po wstawieniu, aktualizacja blokuje oryginalną tabelę

  2. DESC i ASC jako parametr w procedurze składowanej

  3. Wdróż projekt bazy danych SQL Server (SSDT) ​​za pomocą wiersza poleceń

  4. SQL Server dbo.sysdiagrams to tabela użytkownika lub tabela systemowa

  5. Jak wybrać tylko pierwsze wiersze dla każdej unikalnej wartości kolumny?