屬性表達式是指派給屬性的表達式,以在運行時間啟用屬性的動態更新。 例如,屬性表達式可以藉由插入儲存在變數中的電子郵件地址,來更新 Send Mail 工作所使用的 To 行。
表達式可以新增至封裝、工作、Foreach 迴圈、For Loop、Sequence、Foreach 列舉值、事件處理程式、封裝或專案層級連接管理員或記錄提供者。 這些物件的任何屬性都是可擦寫的,都可以實作屬性表達式。 Integration Services 也支援在數據流元件的某些自定義屬性中使用屬性表達式。 變數和優先順序條件約束不支援屬性表達式,但它們包含您可以使用表達式的特殊屬性。
屬性表達式可以以不同的方式更新:
用戶定義的變數可以包含在封裝組態中,然後在部署封裝時更新。 在運行時間,會使用更新的變數值來評估屬性表達式。
包含在表達式中的系統變數會在運行時間更新,這會變更屬性評估的結果。
日期和時間函式會在運行時間進行評估,並將更新的值提供給屬性表達式。
在腳本工作和腳本元件運行的腳本中,可以更新表達式中的變數。
表達式是使用 integration Services 表達式語言Microsoft所建置。 表達式可以使用系統或使用者定義變數,以及表達式語言所提供的運算元、函式和型別轉換。
備註
使用者定義和系統變數的名稱會區分大小寫。
如需詳細資訊,請參閱 Integration Services (SSIS) 運算式。
屬性表達式的重要用法是自定義封裝每個已部署實例的組態。 這可讓您針對不同的環境動態更新套件屬性。 例如,您可以建立屬性表達式,將變數指派給連接管理員的連接字串,然後在部署封裝時更新變數,確保連接字串在運行時間正確無誤。 在評估屬性表達式之前,會載入封裝組態。
屬性只能使用一個屬性表達式,而屬性表達式只能套用至一個屬性。 不過,您可以建置多個相同的屬性表達式,並將其指派給不同的屬性。
某些屬性是使用列舉值所設定。 當您在屬性表達式中參考列舉值成員時,必須使用相當於列舉值成員易記名稱的數值。 例如,如果屬性表示式設定 LoggingMode
屬性,該屬性會使用 列舉中的值 DTSLoggingMode
,則屬性運算式必須使用 0、1 或 2,而不是易記名稱 Enabled
、 Disabled
或 UseParentSetting
。 如需詳細資訊,請參閱 屬性表達式中的列舉常數。
屬性表達式使用者介面
Integration Services 提供一套工具,用於建立和管理屬性表達式。
[ 表達式 ] 頁面可以在任務的自定義編輯器、For 迴圈容器和 Foreach 容器中找到。 [ 表達式 ] 頁面可讓您編輯表達式,並檢視工作、Foreach 迴圈或 For 迴圈所使用的屬性表達式清單。
[ 屬性 ] 視窗,用於編輯表達式,以及檢視封裝或封裝物件所使用的屬性表達式清單。
[ 屬性運算式編輯器] 對話框,用於建立、更新和刪除屬性表達式。
[ 表達式產生器 ] 對話框,用於使用圖形工具建置表達式。 [ 表達式產生器 ] 對話框可以評估您檢閱的表達式,而不需將評估結果指派給 屬性。
下圖顯示您用來新增、變更和移除屬性表達式的使用者介面。
在 [屬性] 視窗和 [表達式] 頁面中,按兩下 [表示式] 集合層級的瀏覽按鈕 [...],以開啟 [屬性運算式編輯器] 對話框。 屬性表達式編輯器可讓您將屬性對應至表達式,以及輸入屬性運算式。 如果您想要使用圖形表示式工具來建立並驗證表示式,請按兩下表示式層級的瀏覽按鈕 (...) 以開啟 [ 表達式產生器 ] 對話框,然後建立或修改並選擇性地驗證表達式。
您也可以從 [屬性表示式編輯器] 對話框開啟 [表達式產生器] 對話方塊。
使用屬性表達式
設定數據流元件的屬性表達式
如果您在 SQL Server Data Tools (SSDT) 中建構封裝,則支援屬性表達式的數據流元件屬性會在它們所屬的數據流工作上公開。 若要新增、變更及移除數據流元件的屬性表達式,請以滑鼠右鍵按兩下數據流元件所屬數據流的數據流工作,然後按兩下 [ 屬性]。 [屬性] 視窗會列出您可以使用屬性運算式的數據流元件屬性。 例如,若要在名為 SampleCustomer 的數據流中建立或修改數據列取樣轉換之 SamplingValue 屬性的屬性表達式,請以滑鼠右鍵按兩下數據列取樣轉換所屬數據流的數據流工作,然後按兩下 [ 屬性]。 SamplingValue 屬性會列在 [屬性] 視窗中,且格式為 [SampleCustomer]。[SamplingValue]。
在 [屬性] 視窗中,您可以新增、變更和移除數據流元件的屬性運算式,方式與其他 Integration Services 物件類型的屬性表達式相同。 [屬性] 視窗也可讓您存取您用來新增、變更或移除資料流元件之屬性表達式的各種對話框和產生器。 如需有關可由屬性表達式更新之數據流元件屬性的詳細資訊,請參閱轉換自訂屬性。
載入屬性表達式
您無法在載入屬性表示式時指定或控制。 當封裝和封裝對象經過驗證時,會評估並載入屬性表達式。 當您儲存封裝、在 SSIS 設計工具中開啟封裝並執行封裝時,就會進行驗證。
因此,在您儲存封裝、執行封裝,或在新增屬性表達式之後重新開啟封裝之前,您將不會看到使用 SSIS 設計工具之封裝物件屬性的更新值。
當呼叫某物件類型的特定方法時,與該物件類型相關聯的屬性運算式,例如連接管理員、記錄提供者和列舉器,也會被載入。 例如,在 Integration Services 建立連接實例之前,會載入連接管理員的屬性。
載入封裝組態之後,就會載入屬性表達式。 例如,變數會先由其組態更新,然後會評估及載入使用變數的屬性表達式。 這表示屬性表達式一律使用組態所設定的變數值。
備註
您無法使用 Set
dtexec 公用程式的 選項來填入屬性表示式。
下表摘要說明何時評估並載入 Integration Services 的屬性運算式。
物件類型 | 載入和評估 |
---|---|
套件、Foreach 迴圈、For 迴圈、序列、工作和資料流元件 | 載入設定之後 驗證之前 執行之前 |
連接管理員 | 載入配置之後 驗證之前 執行之前 建立連接實例之前 |
日誌提供者 | 載入配置之後 驗證之前 執行之前 開啟記錄之前 |
Foreach 列舉器 | 載入組態之後 驗證之前 執行之前 在每次執行迴圈的列舉之前 |
在 Foreach 循環中使用屬性表達式
實施屬性表達式通常很有用,以設定 Foreach 迴圈容器內所使用的連接管理員的ConnectionString
屬性值。 在列舉器將其目前值映射到每次迴圈迭代的變數後,屬性運算式可以利用這個變數的值動態地更新ConnectionString
屬性的值。
如果您想要將屬性表達式與 ConnectionString
Foreach 迴圈使用的 File、Multiple Files、Flat Files 和 Multiple Flat Files 連接管理器的 屬性搭配使用,您應該考慮一些事項。 封裝可以設定為同時執行多個可執行檔,方法是將 屬性設定 MaxConcurrentExecutables
為大於 1 的值或值 -1。 -1 值允許同時執行可執行檔的數目上限等於處理器數目加上兩個。 若要避免可執行檔平行執行產生的負面後果, MaxConcurrentExecutables
值應設定為 1。 如果 MaxConcurrentExecutables
未設定為 1,則無法保證 ConnectionString
屬性的值,而且結果可能會無法預測。
例如,假設 Foreach 循環會列舉資料夾中的檔案、擷取檔名,然後使用 Execute SQL 工作將每個檔名插入數據表中。 如果未 MaxConcurrentExecutables
設定為 1,則如果執行 SQL 工作的兩個實例同時嘗試寫入數據表,就可能發生寫入衝突。
範例屬性表達式
下列範例表示式示範如何在屬性表達式中使用系統變數、運算元、函式和字串常值。
封裝之 LoggingMode 屬性的屬性運算式
下列屬性表達式可用來設定封裝的LoggingMode屬性。 表達式會使用 DAY 和 GETDATE 函數來取得代表日期日期部分的整數。 如果當天是第 1 或 15 天,則會啟用記錄;否則,會停用記錄。 值 1 是 LoggingMode 列舉值成員 Enabled
的整數對等,而值 2 是對等成員 Disabled
的整數。 您必須在表達式中使用數值,而不是使用列舉成員名稱。
DAY((DT_DBTIMESTAMP)GETDATE())==1||DAY((DT_DBTIMESTAMP)GETDATE())==15?1:2
電子郵件訊息主旨的屬性表達式
下列屬性表達式可用來設定 Send Mail 工作的 Subject 屬性,並提供實用的電子郵件主旨。 表達式使用字串常量、系統變數、串接(+)和轉換運算元,以及 DATEDIFF 和 GETDATE 函數的組合。 系統變數是 PackageName
和 StartTime
變數。
"PExpression-->Package: (" + @[System::PackageName] + ") Started:"+ (DT_WSTR, 30) @[System::StartTime] + " Duration:" + (DT_WSTR,10) (DATEDIFF( "ss", @[System::StartTime] , GETDATE() )) + " seconds"
如果套件名稱為 EmailRowCountPP,已在 2005 年 3 月 4 日執行,且執行持續時間為 9 秒,則表達式會評估為下列字元串。
PExpression-->Package: (EmailRowCountPP) Started:3/4/2005 11:06:18 AM Duration:9 seconds.
電子郵件訊息訊息的屬性表達式
下列屬性表達式可用來設定 Send Mail 工作的 MessageSource 屬性。 表達式會使用字串常值、使用者定義變數和串連運算符的組合。 使用者定義的變數名為 nasdaqrawrows
、 nyserawrows
和 amexrawrows
。 字串 “\n” 表示歸位字元。
"Rows Processed: " + "\n" +" NASDAQ: " + (dt_wstr,9)@[nasdaqrawrows] + "\n" + " NYSE: " + (dt_wstr,9)@[nyserawrows] + "\n" + " Amex: " + (dt_wstr,9)@[amexrawrows]
如果 nasdaqrawrows
是 7058, nyserawrows
是 3528,而 amexrawrows
是 1102,則表達式會評估為下列字串。
已處理的資料欄:
納斯達克:7058
NYSE: 3528
AMEX:1102
執行進程工作的可執行檔屬性的屬性表達式
下列屬性表達式可用來設定 Execute Process 工作的 Executable 屬性。 表達式會使用字串常值、運算元和函式的組合。 表達式會使用 DATEPART 和 GETDATE 函式和條件運算元。
DATEPART("weekday", GETDATE()) ==2?"notepad.exe":"mspaint.exe"
如果是當週的第二天,執行程序任務會執行 notepad.exe,否則任務會執行 mspaint.exe。
平面檔案連接管理員的 ConnectionString 屬性之屬性表達式
下列屬性表達式可用來設定一般檔案連接管理員的 ConnectionString 屬性。 表示式會使用單一使用者定義變數 , myfilenamefull
其中包含文本文件的路徑。
@[User::myfilenamefull]
備註
連接管理員的屬性表示式只能使用 [屬性] 視窗來存取。 若要檢視連接管理員的屬性,您必須在 [屬性] 視窗開啟時,在 [SSIS 設計工具] 的 [ 連接 管理器] 區域中選取連接管理器,或以滑鼠右鍵按兩下連接管理員,然後選取 [ 屬性]。
文本文件記錄提供者之 ConfigString 屬性的屬性表達式
下列屬性表達式可用來設定文本文件記錄提供者的 ConfigString 屬性。 表達式會使用單一使用者定義變數 , varConfigString
其中包含要使用的檔案連接管理員名稱。 文件連接管理器會指定寫入記錄項目的文本檔案路徑。
@[User::varConfigString]
備註
記錄提供者的屬性表示式只能使用 [屬性] 視窗來存取。 若要檢視記錄提供者的屬性,您必須在開啟 [屬性] 視窗時,在 [SSIS 設計師] 的 [ 封裝 總管] 索引標籤上選取記錄提供者,或以滑鼠右鍵單擊 [套件總管] 中的記錄提供者,然後按兩下 [ 屬性]。
外部資源
social.technet.microsoft.com 上的技術文章 SSIS 運算式範例