Ssis

缺少腳本任務 sssis 文件副檔名?

  • October 29, 2014

嗨,我創建的腳本任務 C# 有問題我必須在日誌文件前面加上日期,但我的問題是沒有添加文件副檔名日誌文件是沒有副檔名的 log_yyyy_MM_dd 我想要 ti 副檔名日誌文件是 log_yyyy_MM_dd.txt 或 CSV

   private string ReadVariable(string varName)
   {
       object rtnValue = null;
       Variables var = default(Variables);
       try
       {
           Dts.VariableDispenser.LockOneForRead(varName, ref var);
           rtnValue = var[varName].Value.ToString();
       }
       catch (Exception ex)
       {
           throw ex;
       }
       finally
       {
           var.Unlock();
       }
       return rtnValue.ToString();
   }


   private void WriteVariable(string varName, object value)
   {
       Variables var = default(Variables);
       try
       {
           Dts.VariableDispenser.LockOneForWrite(varName, ref var);
           var[varName].Value = value;
       }
       catch (Exception ex)
       {
           throw ex;
       }
       finally
       {
           var.Unlock();
       }
   }

   public void Main()
   {
       //Read Variables
       String sFlatFileConnection = ReadVariable("FlatFileConnection");



       //Get Run Date
       DateTime dtRunDate = DateTime.Now;

       sFlatFileConnection = sFlatFileConnection + dtRunDate.ToString("yyyy_MM_dd");
       WriteVariable("FlatFileConnection", sFlatFileConnection);

       Dts.TaskResult = (int)ScriptResults.Success;
   }
}

執行此操作的更 SSISic 方式是通過表達式。儘管在這裡看到了多個變數,但不要擔心它們。我發現當人們試圖用表達式做太多事情時,診斷和調試錯誤的邏輯會讓你伸手去拿最近的鈍物。

變數

  • FlatFileConnection, 細繩。值 = “C:\ssisdata\so\input\log.txt”
  • ArchiveName, 細繩。評估為表達式 = True。
  • FormatDate, 細繩。評估為表達式 = True。
  • FileExtensionPosition, int32, Value = 0. 評估為 Expression = True;

FileExtensionPosition確定.字元串中最後一次出現的 。

我用來查找字元串中最後一個 X 的懶惰技巧是反轉它。然後它是字元串中的第一個元素,我可以將 1 作為最終參數傳遞給 FindString。

文件擴展位置

這可能是矯枉過正,但我認為這個問題對任何試圖在文件副檔名之前插入值的人都有幫助,我進一步假設,它可能不是 3 個字元的副檔名。

LEN(@[User::FlatFileConnection]) - FINDSTRING(REVERSE(@[User::FlatFileConnection]), ".", 1)

格式日期

這使用包的開始時間作為確定年、月和日期的參考點。您可以使用GETDATE,但如果您的包從晚上 11:59 開始並且需要一分鐘才能執行,因為您知道每次使用 GetDate() 都會重新評估…我寧願不知道會發生什麼。此表達式生成表示日期的文本字元串,格式為 YYYY-MM-DD

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

我用表達式中的換行符呈現它,以便您可以輕鬆查看它,未來的讀者可以修改它。

檔案名稱

現在是時候把所有東西放在一起了。

表達式的第一行將獲取.連接字元串中第一行的所有內容。

第二行很明顯,我們連接一個下劃線

第三行添加了我們的日期字元串

第四行抓取從我們的句點到字元串末尾的剩餘字元。

SUBSTRING(@[User::FlatFileConnection], 1, @[User::FileExtensionPosition]) 
+ "_" 
+ @[User::FormatDate] 
+ RIGHT(@[User::FlatFileConnection], LEN(@[User::FlatFileConnection]) - @[User::FileExtensionPosition])

比姆

Biml 是商業智能標記語言,它允許我用一些 XML 來描述任何商業智能對象。是的,我正在使用 XML 來定義更多的 XML。

通過獲取免費的BIDS Helper,您可以一起玩。為您的 Visual Studio 實例安裝它,右鍵點擊您的解決方案以添加新的 biml 文件,粘貼以下內容,右鍵點擊保存的 biml 文件,瞧,您有一個工作範例。

<Biml xmlns="http://schemas.varigence.com/biml.xsd">
   <Packages>
       <Package Name="dba_81064" ConstraintMode="Linear">
           <Variables>
               <Variable Name="FlatFileConnection" DataType="String">C:\ssisdata\so\input\log.txt</Variable>
               <Variable Name="FormatDate" DataType="String" EvaluateAsExpression="true">(DT_WSTR, 4)  YEAR(@[System::StartTime]) 
   + "-" 
   + RIGHT("0" + (DT_WSTR, 2)  MONTH(@[System::StartTime]), 2) 
   + "-" 
   + RIGHT("0" + (DT_WSTR, 2) DAY(@[System::StartTime]), 2)</Variable>
               <Variable Name="FileExtensionPosition" DataType="Int32" EvaluateAsExpression="true">LEN(@[User::FlatFileConnection]) - FINDSTRING(REVERSE(@[User::FlatFileConnection]), ".", 1)</Variable>
               <Variable Name="ArchiveName" DataType="String" EvaluateAsExpression="true">SUBSTRING(@[User::FlatFileConnection], 1, @[User::FileExtensionPosition]) + "_" + @[User::FormatDate] + RIGHT(@[User::FlatFileConnection], LEN(@[User::FlatFileConnection]) - @[User::FileExtensionPosition])</Variable>
           </Variables>
       </Package>
   </Packages>
</Biml>

發出的包應該有一個變數視窗,如

在此處輸入圖像描述

調試你的腳本

如果我在分配之前和之後放入消息框呼叫,sFlatFileConnection起始值為“C:\ssisdata\so\input\log.txt”,您的程式碼將分配一個值“C:\ssisdata\so\log .txt2014_10_28 我的假設是您希望日誌和 .txt 之間的日期字元串。

如果我使用的是 .NET,我不會在上面使用 Expressions 進行初級聯賽字元串工作。相反,我將使用 .NET 庫,因為它們已經為我完成了所有繁重的工作。具體來說,我將利用System.IO.Path

  • ChangeExtension 允許我更改副檔名
  • GetExtension 抓取目前的

因此,我將副檔名更改為我在 _YYYY_MM_DD 前面添加的目前副檔名。

System.IO.Path.ChangeExtension(sFlatFileConnection, string.Format("_{0}{1}", dtRunDate.ToString("yyyy_MM_dd"), System.IO.Path.GetExtension(sFlatFileConnection));

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