Ако приемем, че използвате 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