मान लें कि आप SQL एजेंट (या समान अनुसूचक) का उपयोग कर रहे हैं
अनुरोध 1/4) मेरे पास एफ़टीपी और/या फ़ाइल कॉपी चरणों को संभालने के लिए एक अग्रदूत कदम होगा। अगर मैं इससे बच सकता हूं तो मैं अपने पैकेज को फ़ाइल हेरफेर के साथ अव्यवस्थित करना पसंद नहीं करता।
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
)
प्रदर्शन उद्देश्यों के लिए, मैं उपरोक्त तालिकाओं को नमूना डेटा के साथ टीएसक्यूएल के माध्यम से लोड करूंगा
-- 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')
निष्पादित SQL कार्य MERGE का लाभ उठाएगा SQL सर्वर के 2008+ संस्करणों में उपलब्ध विवरण। कृपया ध्यान दें कि पिछला सेमी-कोलन 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