Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana saya bisa memuat file datar besar ke dalam tabel database menggunakan SSIS?

Dengan asumsi Anda menggunakan SQL Agent (atau penjadwal serupa)

Reqs 1/4) Saya akan memiliki langkah pendahulu yang menangani langkah-langkah menyalin FTP dan/atau file. Saya tidak suka mengacaukan paket saya dengan manipulasi file jika saya bisa menghindarinya.

Reqs 2/3) Pada tingkat aliran kontrol, desain paket akan terlihat seperti tugas Jalankan SQL yang terhubung ke Aliran Data yang terhubung ke tugas Jalankan SQL lainnya. Seperti yang ditunjukkan @AllenG, Anda sebaiknya dilayani dengan memuat ke tabel pementasan melalui tugas Aliran data. Execute SQL Task pertama akan menghapus semua baris dari tabel staging (TRUNCATE TABLE dbo.DAILY_STAGE)

Kira-kira desain meja terlihat seperti ini. Tabel MICHAEL_BORN adalah tabel Anda yang sudah ada dan DAILY_STAGE adalah tempat aliran data Anda akan mendarat.

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
)

Untuk tujuan demonstrasi, saya akan memuat tabel di atas dengan data sampel melalui 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')

Tugas Execute SQL akan memanfaatkan MERGE pernyataan tersedia di SQL Server edisi 2008+. Harap perhatikan bahwa tanda titik koma adalah bagian dari pernyataan MERGE. Kegagalan untuk memasukkannya akan mengakibatkan kesalahan "Pernyataan MERGE harus diakhiri dengan titik koma (;)."

-- 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) Efisiensi sepenuhnya didasarkan pada data Anda dan seberapa lebar baris Anda tetapi seharusnya tidak buruk.

-- 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. Parsing XML ke SQL Server

  2. duplikat pelanggaran nilai nol pada batasan KUNCI UNIK di Mssql

  3. Menyimpan pesan galat SqlServer di C#

  4. SQLBulkCopy dengan Identity Insert di tabel tujuan

  5. Menghitung Running Total dengan OVER Clause dan PARTITION BY Clause di SQL Server