天天看點

Execute SQL Task 參數和變量的映射

Execute SQL Task能夠執行帶參數的SQL查詢語句或存儲過程(SP),通過SSIS的變量(Variable)對參數指派。對于不同的Connection Manager,在Task中需要使用不同的符号(Parameter marker)來标記一個參數,并且在Parameter Mapping中設定參數名字(Parameter Name)。

在Execute SQL Task Editor中,設定Parameter Mapping的界面如下:

Variable Name:變量的名字,變量的作用域分為User和System,使用 :: 來引用作用域中的變量

Direction:參數的方向,分為輸入參數(Input),輸出參數(Output)和傳回值(Returnvalue)

Data Type:參數的Data Type,必須和變量(Variable)的資料類型相相容

Parameter Name:參數名字,不同的Connection Manager,其值不同,對于OLEDB Connection Manager,使用0,1,2等數值表示第一個,第二個參數,第三個參數等。

Parameter Size:預設值是-1,表示讓SSIS确定參數的長度。如果參數的資料類型是變長的(varchar或varbinary),必須設定參數的長度,為參數值配置設定足夠長度的空間。

Execute SQL Task 參數和變量的映射

在Parameter Mapping中,Parameter Marker和Name受到Connection Type的影響,如下表:

Connection type

Parameter marker

Parameter name

Example SQL command

ADO

?

Param1, Param2, …

SELECT FirstName, LastName, Title FROM Person.Contact WHERE ContactID = ?

ADO.NET

@<parameter name>

SELECT FirstName, LastName, Title FROM Person.Contact WHERE ContactID = @parmContactID

ODBC

1, 2, 3, …

EXCEL and OLE DB

0, 1, 2, 3, …

1,執行SQL查詢語句

樓主在實際開發中,最常用的Connection Type是OLEDB,設定Task的ConnectionType為OLE DB,在SQLStatement屬性中使用 ? 來标記一個參數,? 叫做參數标記(Parameter Marker)。

Execute SQL Task 參數和變量的映射

使用SSIS 變量(Variable)為參數指派,Parameter Name必須是0,1,2等數字

Execute SQL Task 參數和變量的映射

2,執行SP,設定參數的方向

使用Execute SQL Task執行SP時,參數映射的Direction屬性使用Input,Output和Returnvalue 分别表示:輸入參數,輸出參數和SP的傳回值

<a></a>

使用OLEDB Connection Manager,使用 ? 表示一個參數,如圖

Execute SQL Task 參數和變量的映射

在Parameter Mapping Tab中設定參數映射:

第一個參數是SP的傳回值,Direction 選擇 Returnvalue,Parameter Name 是 0;

第二個參數是SP的輸入參數,Direction 選擇 Input,Parameter Name 是 1;

第三個參數是SP的輸出參數,Direction 選擇 Output,Parameter Name 是 2;

Execute SQL Task 參數和變量的映射

3,設定參數的Data Type

樓主整理的參數的Data Type和TSQL 資料類型的映射關系

3.1,數值類型

BYTE:映射 SSIS 的 DBTYPE_UI1,映射 TSQL 的 TinyInt

SHORT:映射 SSIS 的 DBTYPE_I2, 映射 TSQL 的 smallint

LONG:映射 SSIS 的 DBType_I8,映射 TSQL 的 bigint

FLOAT: 映射 TSQL 的 float(24)

DOUBLE:映射 TSQL 的 float(53)

DECIMAL: 映射 TSQL 的 decimal

3.2,日期/時間類型

DATE:映射TSQL的DateTime2(7)

注意:如果SSIS 變量的Data Type是DateTime,那麼參數的Data Type應使用 DATE,但是,資料類型為DateTime的變量,隻保留到秒,毫秒位是0.

3.3,字元串類型

VARCHAR: 映射TSQL的varchar

NVARCHAR: 映射TSQL的nvarchar

4,在做增量更新時,發現導入的資料量少于源資料

樓主在調試SSIS Package時,使用ModifiedDate字段做增量更新,Package中使用Execute SQL Task擷取資料源中DataUpdateTime字段的最大值,并将該值指派給變量:User::MaxLastModifiedDate,Package運作成功,但是導入的資料量少于源資料;通過測試,發現DateTime類型的變量,其時間部分隻保留到秒,而不會計算毫秒部分,導緻導入的資料量少于源資料。

調試SSIS Package,下斷點(breakpoint),打開Watch Tab,檢視變量運作時的值:

Execute SQL Task 參數和變量的映射

這兩個變量定義為DateTime類型,經過測試,如果變量定義成String類型,實際上是一樣的,時間隻會精确到秒:

Execute SQL Task 參數和變量的映射

然而,資料源中的DataUpdateTime使用的Datetime2(7),精度十分高:

Execute SQL Task 參數和變量的映射

發生這種問題的根源是 SSIS的資料類型和SQL Server的資料類型不是一一對應的,存在差異。為了避免這種問題,可以對MaxLastModifiedDate 變量加1s。

在使用OLEDB資料源導入資料時,使用如下的Where條件,就能把所有的資料都導入到DW中。

注意:SSIS 變量的日期和時間類型隻保留到秒,而資料庫中的時間可以保留到毫秒位(1-7位毫秒數)

參考文檔:

<a href="https://blogs.msdn.microsoft.com/mattm/2007/02/27/sql-server-sp2-whats-new-for-ssis/" target="_blank">SQL Server SP2 – What’s new for SSIS</a>

<a href="https://msdn.microsoft.com/en-us/library/ms140355.aspx" target="_blank">Map Query Parameters to Variables in an Execute SQL Task</a>

<a href="https://msdn.microsoft.com/en-us/library/cc280502.aspx" target="_blank">Parameters and Return Codes in the Execute SQL Task</a>

本文版權歸作者和部落格園所有,歡迎轉載,但未經作者同意,必須保留此段聲明,且在文章頁面醒目位置顯示原文連接配接,否則保留追究法律責任的權利。

本文轉自悅光陰部落格園部落格,原文連結:http://www.cnblogs.com/ljhdo/p/4549663.html,如需轉載請自行聯系原作者