1

好吧,我的第一個問題就在這裏。SSIS的SQL數據庫設計

當前用戶正在使用一個巨大的Access應用程序。他們需要一個具有基於Access數據和一些修改的功能的Web應用程序。

好的沒問題。我使用Access to SQL遷移助手轉換數據,然後編寫一些從Web端執行的SSIS包,以便根據需要更新應用程序。這裏一切都很好。

這裏是我有點難倒的地方。有兩種類型的進口,季度和年度。季度是好的,但每年的進口量都會造成問題。每年進口可以用於已採納的預算或建議的預算(每個都在一個單獨的Access數據庫中)。我爲每種類型的年度導入都有一個SSIS包。其中信息那張表如下..

CREATE TABLE Budget 
(
    BudgetID   uniqueidentifier NOT NULL, 
    ProjectNumber  int NOT NULL, 
    SubProjectNumber varchar(6) NOT NULL, 
    FiscalYearBegin int NOT NULL, 
    FiscalYearEnd  int NOT NULL, 
    Sequence   int NULL, 
    QuarterImportDate datetime NULL, 
    ProposedBudget  money NULL, 
    AdoptedBudget  money NULL, 

    CONSTRAINT PK_Budget PRIMARY KEY CLUSTERED 
    (
     BudgetID ASC 
    ), 

    CONSTRAINT uc_Budget UNIQUE NONCLUSTERED 
    (
     ProjectNumber ASC, 
     SubProjectNumber ASC, 
     FiscalYearBegin ASC, 
     FiscalYearEnd ASC, 
     Sequence ASC 
    ) 
) 

此外,還有可能是預算特定年份的多個版本中的ProjectSubProjectFiscalYearBeginFiscalYearEnd條款。這就是爲什麼有一個序列號。

所以,問題變得,因爲我有2個不同的SSIS包,每個是1個特定列(無論是ProposedBudgetAdoptedBudget)的更新語句,我跟蹤了正確的序列中沒有有效的方法。

請讓我知道,如果我可以做得更清楚,任何建議都會很棒!

謝謝。

+0

BudgetId和Sequence之間的區別是什麼? – AaronLS

+0

BudgetID只是該行的唯一標識符(NEWID)。該序列是爲了那一年的版本。例如,您正在爲FiscalYear 2010/2011進行首次導入。每個項目和子項目都將具有FiscalYearBegin = 2010,FiscalYearEnd = = 2011和Sequence = 0.下一個導入將具有Sequence = 1 – SeanRouz

+0

因此,如果您將ProposedBudget作爲序列1導入,則AdoptedBudget是對同一行的單獨更新, 1?你確實知道每個預算和預算都是一對一的嗎?是否有可能有更多的預算預算或預算預算使得你只有一個序列? – AaronLS

回答

0

像這樣的東西會爲您帶來一個空的AdoptedBudget的下一個項目,但我認爲當有多個AdoptedBudgets時您需要一個遊標。我正在考慮使用更新進行嵌套子查詢,但是當有多個AdoptedBudgets時,這不起作用。這聽起來像在源應用程序中,他們應該在添加AdoptedBudget時選擇ProposedBudget,以便創建關係。這樣就很清楚哪個AdoptedBudget與哪個ProposedBudget一起使用,並且這將是一個簡單的連接。我有幾乎相同的情況,但區別在於我不保留所有版本。我只需保留最新的「ProposedBudget」和最新的「AdoptedBudget」。試圖將它們全部排序有點困難。

--get the smallest SequenceId with an unfilled AdoptedBudget 
    Select min(SequenceID), 
    ProjectNumber, 
    FiscalYearBegin, 
    SubProjectNumber --any other fields needed for the join 
    From Budgets b 
    Where AdoptedBudget is null 
    Group By 
    ProjectNumber, 
    FiscalYearBegin, 
    SubProjectNumber --any other fields needed for the join 


--This won't work I don't believe 
Update Budgets 
Set AdoptedBudget = BudgetAmount 
From Budgets b 
Inner Join SourceAdoptedBudgets ab on 
    b.ProjectNumber = ab.ProjectNumber 
    b.FiscalYearBegin = ab.FiscalYearBegin 
    b.FiscalYearEnd = ab.FiscalYearEnd 
Inner Join 
(
    --get the smallest SequenceId with an unfilled AdoptedBudget 
    Select min(SequenceID), 
    ProjectNumber, 
    FiscalYearBegin, 
    SubProjectNumber --any other fields needed for the join 
    From Budgets b 
    Where AdoptedBudget is null 
    Group By 
    ProjectNumber, 
    FiscalYearBegin, 
    SubProjectNumber --any other fields needed for the join 
) as nextBudgets 
on --the join fields again 
+0

我正在考慮爲AdoptedBudget更新語句找到Null的相同路線。只是不能把這些碎片放在一起。他們從應用程序中選擇他們正在進行的哪種類型的導入(Adropted,Proposed)。糾正我,如果我錯了,但以這種方式檢查將強制用戶上傳建議首先,然後採用? – SeanRouz

+0

是的,他們將不得不首先上傳建議。我會按照關鍵字段進行分組,並通過連接建議,並查看計數不匹配的次數。似乎有人可能會上傳3個建議的預算,然後最終會通過預算。建議的預算有哪些?我會擺脫建議/採用的預算字段,而只有一個BudgetAmount和VersionType指示它是建議的或採用的。您可以從兩個來源中進行選擇,將它們合併,然後將分區的row_number字段在importdate – AaronLS

+0

上生成序列。我在開始時就想到了這一點,這就是我最終做的,因此感謝您讓我走上正確的軌道。我放了一個單一的BudgetAmount字段,並且有一個標識符用於建議/採用。我很驚訝,你有我的解釋權!你完全搖滾..我整天和0個技術人員一起工作,所以這是一個很好的舒適區。謝謝! – SeanRouz

0

像這樣使用BudgetType。當然,您可能會爲這些或IsAdopted位字段創建一個代碼表。但你明白了。

Select 
budgets.* 
,row_number() over(partition by 
    ProjectNumber 
    ,SubProjectNumber 
    ,FiscalYearBegin 
    ,FiscalYearEnd 
    order by QuarterImportDate) as SequenceNumber 
From 
(
    Select 
    ProjectNumber 
    ,SubProjectNumber 
    ,FiscalYearBegin 
    ,FiscalYearEnd 
    ,QuarterImportDate 
    ,'Proposed' as BudgetType 
    ,ProposedBudget as Budget 
    From sourceProposed 

    Union 

    Select 
    ProjectNumber 
    ,SubProjectNumber 
    ,FiscalYearBegin 
    ,FiscalYearEnd 
    ,QuarterImportDate 
    ,'Adopted' as BudgetType 
    ,AdoptedBudget as Budget 
    From sourceAdopted 
) as budgets