在ssis中也可以使用變數來當作查詢條件,但只限於sql server哦,其他的就沒有支援。
若你想要使用ssis,並對口的資料庫是sql server,就可以來看一下此篇文章
本次使用的範例資料庫為sql server的AdventureWorks資料庫
資料內容約如下,我假設想要在ssis開發階段,利用變數去測試資料回傳結果對不對的話,就可以使用這次的範例來做。
開啟visual studio(2005或2008都可以)
首先,先定義二個全域變數(若不知道如何建立變數的話,請先參考我blog的ssis分類中之前的文章),怎麼知道是全域變數呢?如果你的變數範圍名稱等同你的dtsx的檔名就是全域的
變數的定義
cid:準備當作sql 查詢參數用,並先給予預設值。
rs:當作輸出結果集的暫存變數。
接下來回到控制流程畫面中,拉出一個"資料流程工作"控制項
在"資料流程工作"上按滑鼠右鍵,選編輯
在"ole db來源",上點滑鼠右鍵選編輯(ole db連接管理員的部份,建議選擇使用共用資料來源,若不會設定的請參考SSIS-建立連線資料-PART1)
資料存取模式請選sql 命令,然後在sql 命令文字方字格中輸入下方sql 語法,
SELECT *FROM Sales.Customer
WHERE (CustomerID = ?)
"?"代表這是要接變數的查詢條件,且這種查詢條件只能放在where
(ps:我試過不能用在子查詢的where 條件中,他只能定義在主sql的where條件上)
接下來點選"參數"按鈕,會開啟如下面的視窗,請在parameter0的部份設成我們剛才定義的cid變數,若有多個,則會有parameterX個參數接口,請接照順序對應
接下來,切換到資料行看是否有對應到欄位,這裡你可以選擇你想要輸出哪欄位,若有不要的欄位,在此也可以將勾勾拿掉,ok後按確定
接下來,在資料流程目的地,拉出一個"資料錄集目的地",為什麼要拉這個而不是拉"ole db目的地"呢?
因為我們這次只是教學,所以只是純檢視結果,若實際上是要寫到db的話,那就是拉ole db目的地或sql server 目的地(如果你的目的地是sql server的話)
拉出後,再把"ole db 來源"的綠線拉到"資料錄集目的地"上
(為什麼線上會有一個小圖呢?容我稍後說明)
接下來在"資料錄集目的地"控制項上按滑鼠右鍵選編輯,然後照下圖設定,我們在variablename中設定我們之前所設定的變數"rs"
切換到"輸入資料行"頁籤,這裡可以選擇你想要呈現的欄位為哪些
在此說明一下,使用"資料錄集目的地"執行完後,是沒有任何實際儲存的,他就像是一個runtime 時儲存記憶體中的資料,一結束後,就消失了
但我們可以利用即時檢視視窗來看這個暫存的資料體資料裡有什麼東西
在綠線上按滑鼠右鍵選編輯,選擇照下圖的方式設定
你就可以在綠線上看到這個圖示了
好了,到此算是大功告成了,我們來看一下執行結果
先回顧一下,我們之前在變數cid有給預設值"2",按下鍵盤上的F5後,結果如下
在上圖中的黃色控制項,表示正在執行中,所以呈現黃色,在右圖就是經由 "ole db來源"的sql所下出來的資料集結果
若要讓ssis跑完的話,請按一下"卸離"按鈕,或按下 來讓程式繼續執行
下圖為執行成功後的結果畫面
這樣看倌們了解了嗎?
你可以試試看把cid變數換成3的話,結果是不是會變呢?
歡迎留言討論哦!
每一篇教學文章都是花很多時間做的,也希望獲得些許的迴響,來共同學習..

請問 因為若使用ADO.net來源就不能使用變數嗎
mary你好 請問你的資料來源是? 用ado.net的話看你是在什麼地方用 在"控制流程"頁籤中使用ado.net的話,就可以下變數 如果是在"資料流程"頁籤中的"ado.net來源"的話,就不行(這個只有2008的ssis才有,2005叫做datareader) 給你參考看看
請問rs:當作輸出結果集的暫存變數,這部份我不太懂可以幫我詳細說明嗎?感謝
請看我第二張的圖片 這只是說在ssis中建一個變數,而這個變數的型態為object,可以存放資料集的意思
不好意思 我最近剛好有相關問題 想請問若是資料來源為ORACLE 我想要在我的WHERE 條件裡由一個變數可以做動態設定 EX:WHERE 日期>變數 在MS SQL可以照您的方法做,可是ORA沒辦法如此 請問是不是還有其他方法呢
ssis中不支援oracle動態參數 你只能在script task工作中寫sql 字串來串接,再輸出字串,但這樣很麻煩 另一個解法,只能你準備幾個模式,而依判斷來執行不同的資料流程 給你參考
SQL字串應該是你在BLOG提到的另一個方法吧!! 那方法我也有評估過,只是對我目前的專案沒有簡化的效果 那請問你說的準備模式依判斷來執行資料流程這個方法,我不太了解耶 是不是可以請你再幫我說明一下!! 萬分感謝!!
其實也就是使用script task的方式自己寫程式做新刪修的意思了,不透過資料流程的方式做,所以會說比較麻煩
Ora若使用OLE DB來源,也是可以使用動態變數的喔~ 方法跟MS SQL相同的。 若使用ADO NET來源也是可以使用變數,但稍微麻煩一點,方法請參考~ http://blogs.msdn.com/b/sqlforum/archive/2011/04/11/forum-faq-how-do-i-use-parameters-in-an-ssis-ado-net-source.aspx 或google "SSIS ADO NET parameter"