Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm cách nào để tải một tệp phẳng lớn vào bảng cơ sở dữ liệu bằng SSIS?

Giả sử bạn đang sử dụng SQL Agent (hoặc bộ lập lịch tương tự)

Câu hỏi 1/4) Tôi sẽ có một bước trước xử lý FTP và / hoặc các bước sao chép tệp. Tôi không muốn làm lộn xộn các gói của mình bằng thao tác tệp nếu tôi có thể tránh được.

Câu hỏi 2/3) Ở mức luồng điều khiển, thiết kế gói sẽ trông giống như một tác vụ SQL Thực thi được kết nối với một Luồng dữ liệu được kết nối với một tác vụ SQL Thực thi khác. Như @AllenG đã chỉ ra, bạn sẽ được phục vụ tốt nhất bằng cách tải vào bảng dàn thông qua tác vụ Luồng dữ liệu. Tác vụ SQL thực thi đầu tiên sẽ xóa bất kỳ hàng nào khỏi bảng dàn (TRUNCATE TABLE dbo.DAILY_STAGE)

Gần đúng thiết kế bảng trông như thế này. Bảng MICHAEL_BORN là bảng hiện có của bạn và DAILY_STAGE là nơi luồng dữ liệu của bạn sẽ đến.

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
)

Với mục đích trình diễn, tôi sẽ tải các bảng trên với dữ liệu mẫu qua 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')

Tác vụ Execute SQL sẽ tận dụng lợi thế của MERGE câu lệnh có sẵn trong các phiên bản SQL Server 2008+. Xin lưu ý rằng dấu chấm phẩy ở cuối là một phần của câu lệnh MERGE. Nếu không bao gồm nó sẽ dẫn đến lỗi "Câu lệnh MERGE phải được kết thúc bằng dấu chấm phẩy (;)."

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

Câu hỏi 5) Hiệu quả hoàn toàn dựa trên dữ liệu của bạn và độ rộng của các hàng của bạn nhưng nó không quá tệ.

-- 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. Truyền c # DataTable làm tham số cho thủ tục được lưu trữ trong MS SQL Server 2008

  2. Xóa các bản sao khỏi tập dữ liệu lớn (> 100Mio hàng)

  3. Làm thế nào để thực thi một gói SSIS từ .NET?

  4. Giới hạn kích thước chỉ mục 900 byte về độ dài ký tự

  5. Đang cố gắng nhập tệp FoxPro DBF vào SQL Server