Sql-Server-2008

使用表達式配置日誌提供程序的 SSIS 包 - 創建多個日誌文件,如果我更改原始目標文件夾則失敗

  • January 5, 2016

我創建了一個小型 SSIS 解決方案來說明我的問題。不幸的是,我似乎無法在此處附加它,因此我將嘗試解釋。我可以將解決方案單獨發送給人們。

SSIS SQL Server 2008。我有一個名為“Parent_Package”的包,其中包含一個變數:“User::Log_Path”。在設計期間,我為它分配了這個值:“C:\temp\Log_Design_Time”。該軟體包配置了一個日誌提供程序(簡單文本文件)。日誌文件的連接字元串有一個表達式:@

$$ User::Log_Path $$ + “" + @$$ System::PackageName $$+$$ expression for timestamp $$+“.txt”。如您所見,我想為每個包執行創建一個新的日誌文件。 如果我現在執行這個包,我將生成兩個日誌文件!從我創建包的時間開始,就會有一個時間戳。該文件只有標題欄位,沒有其他資訊。第二個文件具有正確的時間戳和正確的輸出資訊:

一次執行 - 創建了兩個日誌文件(一個只有標題欄位)

似乎第一個文件是在驗證期間創建的(即使我為日誌文件連接管理器設置了 DelayValidation = True)。所以我的第一個問題是為什麼會這樣?這似乎不是正確的行為。現在為了進行下一步,我創建了一個子包“Package_Child”。我在父包中添加了一個執行包任務來執行這個子包。在子包中,我添加了一個與上面同名的變數:“User::Log_Path”。接下來,我在子包中添加一個配置,使“User::Log_Path”的值從父包變數中以同名方式獲取。最後,我將日誌提供程序添加到子包中,並以與上述父包相同的方式進行設置。

現在讓我們再次執行父包。這一次我將得到三個日誌文件:兩個用於父級,一個用於子級:

父包執行 - 創建了三個輸出文件

對於我的下一個測試,我現在想更改日誌文件的位置,所以我修改了

$$ User::Log_Path $$包中的變數為“C:\temp\Log_Run_Time”。如果我現在執行,我將有四個日誌文件!兩個用於“Log_Run_Time”目錄中的父包和兩個用於子包 - 一個在“Log_Design_Time”中,一個在“Log_Run_Time”目錄中: 父包執行 - 更改 Log_Path 變數值 在此處輸入圖像描述

這是怎麼回事?最後,如果我只是刪除原始的“Log_Design_Time”目錄,我的子包將開始失敗並抱怨它找不到指定的路徑:

子包失敗

顯然它仍在尋找之前指定的路徑,但為什麼呢?同樣,我在所有連接管理器和包本身上設置了“延遲驗證”= True。我很感激這方面的任何幫助。

謝謝!

PS這裡是日誌路徑的完整表達式:@

$$ User::Log_Path $$ + “\” + @$$ System::PackageName $$+ “” + (DT_STR, 4, 1252)DATEPART(“yyyy”, @$$ System::ContainerStartTime $$) + RIGHT(“0” + (DT_STR, 2, 1252)DATEPART(“mm”, @$$ System::ContainerStartTime $$), 2) + RIGHT(“0” + (DT_STR, 2, 1252)DATEPART(“dd”, @$$ System::ContainerStartTime $$), 2) + “” + RIGHT(“0” + (DT_STR, 2, 1252)DATEPART(“hh”, @$$ System::ContainerStartTime $$), 2) + RIGHT(“0” + (DT_STR, 2, 1252)DATEPART(“mi”, @$$ System::ContainerStartTime $$), 2) + RIGHT(“0” + (DT_STR, 2, 1252)DATEPART(“ss”, @$$ System::ContainerStartTime $$), 2) + “.txt”

我想我已經弄清楚了(至少部分)。似乎為了避免為子包創建重複的日誌文件,“子”包中的“Log_Path”變數的值必須設為空白。如果沒有值,驗證過程將不會創建額外的文件,並將正確繼承“父”中指定的值。這仍然不能完全解決“父”包的問題,因為如果沒有為“Log_Path”變數指定任何值,我就無法從開發環境中執行它。我發現的唯一方法是將其設為空白,保存它,然後從命令行(DTExec)執行它,同時通過 SET 選項傳遞所需的變數值。這最終導致只有兩個文件而不是四個。

我仍然不明白為什麼驗證過程(至少我認為它是驗證過程)使用設計時值創建那些“額外”文件。這似乎是一種錯誤的行為。

我相信這與系統變數的時間和解釋有關。

使用這個表達式來建構一個帶有 _.log 的文件名,我一直在使用:

@[User::PathROOT]+"edw_logs\\"+ @[System::PackageName] + "_"+(DT_STR,4,1252) YEAR(GETDATE())+ RIGHT("00"+(DT_STR,2,1252) MONTH(GETDATE()),2)+RIGHT("00"+(DT_STR,2,1252) DAY(GETDATE()),2)+RIGHT("00"+(DT_STR,2,1252)DATEPART("Hour", @[System::StartTime]),2) + RIGHT("00"+ (DT_STR,2,1252)DATEPART("Minute", @[System::StartTime]) ,2) + RIGHT("00"+(DT_STR,2,1252)DATEPART("Second", @[System::StartTime]),2) +".log"

並且在驗證和執行時創建了兩個文件。

僅使用使用者變數,它們在執行時被評估並且只創建一個文件。看到這個:

@[User::PathROOT]+"edw_logs\\"+ @[User::MyPackageName] + "_"+(DT_STR,4,1252) YEAR(GETDATE())+ RIGHT("00"+(DT_STR,2,1252) MONTH(GETDATE()),2)+RIGHT("00"+(DT_STR,2,1252) DAY(GETDATE()),2)+RIGHT("00"+(DT_STR,2,1252)DATEPART("Hour", GETDATE()),2) + RIGHT("00"+ (DT_STR,2,1252)DATEPART("Minute", GETDATE()) ,2) + RIGHT("00"+(DT_STR,2,1252)DATEPART("Second", GETDATE()),2) +".log"

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