Ssis

如何格式化週末的 SSIS 表達式

  • April 29, 2015

在命名 excel 輸出時,我有以下格式來考慮週末。如何僅獲取日期而不是完整的開始時間,如 20150429 格式?

 ((DT_I4)DATEPART("weekday",@[System::StartTime]) ==2 ? 

   Replace((DT_STR, 20, 1252)(DATEADD( "D", -3,@[System::StartTime])),":","") + 
".xlsx" :   

   Replace((DT_STR, 20, 1252)(DATEADD( "D", -1,@[System::StartTime])),":","") + 

".xlsx")

約會

要獲得 YYYYMMDD,有時寫為 CCYYMMDD,我會使用如下表達式

(DT_WSTR,4)YEAR(@[System::StartTime]) 
+ RIGHT("0" + (DT_WSTR,2)MONTH(@[System::StartTime]), 2) 
+ RIGHT("0" + (DT_WSTR,2)DAY(@[System::StartTime]), 2)

閱讀後,我使用該Year函式提取 4 位數年份,然後將其轉換為 unicode 字元串。

然後我使用該Month函式返回月份數。然後我將其轉換為字元串。這個和 day 的挑戰在於它們以整數形式返回,而前導零是顯示偽影。所以我將一個 1 或 2 個字元的整數值轉換為一個字元串,並在它前面加上一個前導零。在這一點上,我要麼有一個值,要麼有0175 012% 的時間,這可行,但我們需要修復剩下的 25%,所以我用RIGHT呼叫包裝結果值,只保留尾隨的 2 個值。

泡沫,沖洗重複,但我使用該DAY功能。

取所有三個值並根據需要組合

我個人的偏好是在我的 SSIS 包中有很多變數,所以我可能會使用上面名為Date_YYYMMDD. 或者我可能已經創建了 3 個單獨的實體作為字元串,然後將它們連接在一起,因為我可能同時需要 YYYYMMDD 和 YYYY-MM-DD 並且不願意維護這種連接/修剪邏輯。

這是解決這個問題的一般方法。讓我們開始著手解決您的具體問題。

準備好開始過週末了

我真的不明白週末的表達方式是什麼,但看起來你要麼想要一天回來,要麼想要從今天回來 3 天。那是我世界中的一個變數。

我創造 @

$$ User::SourceDate $$,類型為 DateTime 並將 EvaluateAsExpression 設置為 true 並使用此公式

(DT_I4)DATEPART("weekday",@[System::StartTime]) ==2 ?
DATEADD( "D", -3,@[System::StartTime]):
DATEADD( "D", -1,@[System::StartTime])

現在我的邏輯很好並且被封裝了,如果我發現我還有另一個案例需要考慮(今天是 1 或 3 天,我需要推遲 4 或 2 天),那麼我只需修復並測試這一件事。

使用源日期

現在我們有了 SourceDate,我們將應用第一組表達式將其轉換為 YYYYMMDD 字元串。創建第二個@[User::SourceDate_YYYYMMDD]String 類型的變數,將 EvaluateAsExpression 設置為 true 並使用以下表達式

(DT_WSTR,4)YEAR(@[User::SourceDate])
+ RIGHT("0" + (DT_WSTR,2)MONTH(@[User::SourceDate]), 2)
+ RIGHT("0" + (DT_WSTR,2)DAY(@[User::SourceDate]), 2

看看我們如何在這裡簡單地使用我們的變數 SourceDate。一點都不復雜

使我們的文件名

最後一點將使用我們的 SourceDate 的字元串版本並將文件副檔名附加到它上面。第三個變數是@[User::NewFileName]String類型,EvaluateAsExpression = true

@[User::SourceDate_YYYYMMDD] + ".dtsx"

在這裡,我們只是將.dtsx副檔名應用於我們的字元串,但是當我們將其分解為小問題時,在我們的文件前面加上 ClientName_YYYYMMDD.xlsx 是一個更簡單的問題。

比姆所有的東西

最後,如果沒有相應的 Biml,這將不是我的答案。Biml,是商業智能標記語言。它是商業智能的作業系統。我們將使用它來生成一個 SSIS 包。您只需下載 Visual Studio/BIDS/SSDT-BI 的免費外掛,稱為BIDS Helper

  1. 右鍵點擊 SSIS 項目並選擇添加新的 Biml 文件
  2. 點兩下 BimlScript.biml 文件,將內容替換為以下內容
  3. 右鍵點擊 BimlScript.biml 並選擇“生成 SSIS 包”
  4. 查看添加到項目中的 SSIS 包
  5. 休息一下
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
   <Packages>
       <Package Name="dba_99131" ConstraintMode="Linear">
           <Variables>
               <Variable 
                   DataType="DateTime" 
                   Name="SourceDate" 
                   EvaluateAsExpression="true">
   (DT_I4)DATEPART("weekday",@[System::StartTime]) ==2 ?
           DATEADD( "D", -3,@[System::StartTime]):
           DATEADD( "D", -1,@[System::StartTime])
                   <Annotations>
                       <Annotation AnnotationType="Description">
                           Calculate 1 or 3 days back depending on day of week
                       </Annotation>
                   </Annotations>
               </Variable>
               <Variable 
                   DataType="String" 
                   Name="SourceDate_YYYYMMDD" 
                   EvaluateAsExpression="true">
   (DT_WSTR,4)YEAR(@[User::SourceDate])
   + RIGHT("0" + (DT_WSTR,2)MONTH(@[User::SourceDate]), 2)
   + RIGHT("0" + (DT_WSTR,2)DAY(@[User::SourceDate]), 2)
                   <Annotations>
                       <Annotation AnnotationType="Description">
                           Convert our date into a YYYYMMDD format
                       </Annotation>
                   </Annotations>
               </Variable>
               <Variable 
                   DataType="String" 
                   Name="NewFileName"
                   EvaluateAsExpression="true"
                   >@[User::SourceDate_YYYYMMDD] + ".dtsx"
                   <Annotations>
                       <Annotation AnnotationType="Description">
                           Generate our final file name
                       </Annotation>
                   </Annotations>
               </Variable>
           </Variables>
       </Package>
   </Packages>
</Biml>

樣品包

在此處輸入圖像描述

引用自:https://dba.stackexchange.com/questions/99131