Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как мога да заредя голям плосък файл в таблица на база данни с помощта на SSIS?

Ако приемем, че използвате SQL Agent (или подобен планировчик)

Reqs 1/4) Бих искал предшестваща стъпка да обработва стъпките за FTP и/или копиране на файл. Не обичам да претрупвам пакетите си с манипулиране на файлове, ако мога да го избегна.

Reqs 2/3) На ниво контролен поток дизайнът на пакета ще изглежда като задача за изпълнение на SQL, свързана с поток от данни, свързан с друга задача за изпълнение на SQL. Както посочи @AllenG, най-добре ще бъдете обслужени чрез зареждане в етапна таблица чрез задачата за поток от данни. Първата задача за изпълнение на SQL ще изчисти всички редове от междинната таблица (TRUNCATE TABLE dbo.DAILY_STAGE)

Приблизителният дизайн на масата изглежда така. Таблицата MICHAEL_BORN е вашата съществуваща таблица, а DAILY_STAGE е мястото, където ще пристигне потокът от данни.

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
)

За демонстрационни цели ще заредя горните таблици с примерни данни чрез 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')

Задачата Execute SQL ще се възползва от MERGE изявление, налично в издания 2008+ на SQL Server. Моля, имайте предвид, че точката и запетая е част от израза MERGE. Неуспехът да го включите ще доведе до грешка „Изявление MERGE трябва да бъде прекратено с точка и запетая (;).“

-- 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) Ефективността се основава изцяло на вашите данни и колко широки са вашите редове, но не би трябвало да е ужасно.

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

  2. Как да вмъкна ГРУПО с допълнителна колона, показваща име на файл?

  3. Заобикалянето на поддръжката на курсора не е внедрена функция за SQL Server Parallel DataWarehousing TDS грешка

  4. Функция срещу съхранена процедура в SQL Server

  5. Разбиране на размера на съхранение на „време“ в SQL Server