SSIS 資料型別 第二篇:變數的資料型別

悅光陰發表於2020-05-29

變數(Variable)用於儲存在Package執行時用到的值,整合服務支援兩種型別的變數:使用者自定義的變數和系統變數,自定義的變數由使用者來定義,系統變數由整合服務來定義。

變數的用途十分廣泛,用於容器、Task和事件處理程式中,在Script Task和Scipt Component 也會用變數。SSIS中的變數是強型別的,這意味著必須為變數設定正確的型別。

一,變數的型別

SSIS變數支援的型別列表:

  • Boolean:布林型別,只有兩個有效值:true 和 false
  • Char:單個字元
  • DateTime:日期和時間,格式是:5/29/2020 6:05:48 PM
  • DBNull:NULL
  • Decimal:精確小數
  • Double 和 Single,雙精度和單精度浮點數
  • String:字元型別
  • Object:System.Object型別
  • SByte,Int16,Int32,Int64:有符號的整數,可以為正整數、0和負整數
  • Byte,Uint32,Uint64:無符號的整數,值必須大於等於0,Byte佔用1個位元組,相當於UInt8,

最為特殊的是Object型別,該型別的變數可以轉換為其他資料型別。這些型別,有些可以和TSQL的資料型別進行匹配,有些不能匹配,在使用時,要根據自己的需要,為變數設定正確的資料型別。

二,變數的值

SSIS的變數不允許為null,當沒有為變數賦值時,變數有預設值:

經過測試,string 資料型別的長度可能是8000Bytes,也就是對應SQL Server的varchar(8000) 或 nvarchar(4000) 

三,變數的資料型別和TSQL資料型別的對映

SSIS 變數的資料型別,不同於SSIS的資料型別,但都和SSIS的資料型別相相容,在進行表示式求值時,SSIS自動將變數的資料型別隱式轉換成SSIS的資料型別,然後進行求值。

1,字元資料型別

字元變數和TSQL資料型別的對映關係:

  • String:char,nchar,varchar(n),nvarchar(n), 最大8000個位元組。
  • object:varchar(max),nvarchar(max)
  • Char: char(1)

2,數值型別

數值型別的變數和TSQL資料型別的對映關係:

  • Boolean:bit
  • Int64:bigint
  • Int32:int
  • Int16:smallint
  • Byte:tinyint
  • object:varbinary(max), varchar(max)
  • 精確小數:Decimal 在SQL Server 2012以後,對應TSQL的decimal
  • 近似小數:Single 對應TSQL的float(24),  Double 對應TSQL的float(53)

3,日期/時間型別

日期/時間型別的變數和TSQL資料型別的對映關係:

  • DateTime:對應TSQL的datetime
  • Object:對應TSQL的time,date,datetime2

4,NULL

DBNull對應TSQL的NULL,這個型別很奇怪,暫時不知道用途。

四,如何處理TSQL中的max型別?

在執行Execute SQL Task時,如果把nvarchar(max) 和 varchar(max) 型別的值賦值給變數,並且變數的型別是String,那麼SSIS會丟擲錯誤,錯誤訊息如下:

[Execute SQL Task] Error: An error occurred while assigning a value to variable "strVar": "The type of the value (DBNull) being assigned to variable "User::strVar" differs from the current variable type (String). Variables may not change type during execution. Variable types are strict, except for variables of type Object.".

錯誤訊息會誤導開發者做出錯誤的判斷,實際上,正確的做法是把變數的型別修改Object 或者把欄位的型別修改為nvarchar(n) 或者varchar(n)。

但是,當變數的長度大於等於8000位元組時,實際上,無法通過變數來傳遞到其他元件中。

舉個例子,在EXECUTE SQL TASK的引數對映中,把Parameter Size 設定為-1,表示不限制變長字元和binary的長度,但是,實際上,當位元組數量大於8000時,無法把Object型別的變數轉換為NVARCHAR型別。

SSIS會丟擲錯誤訊息,從Object變數中抽取資料時出錯:

[Execute SQL Task] Error: Executing the query "insert into dbo.TestDT values(?)" failed with the following error: "An error occurred while extracting the result into a variable of type (DBTYPE_WSTR)".

從資料型別DBTYPE_WSTR中,可以看出,通過EXECUTE SQL TASK 轉換的NVARCHAR 和 -1 (Parameter Size),實際上,最大值是NVARCHAR(4000)  或 VARCHAR(8000)。

 

參考文件:

Integration Services (SSIS) Variables

相關文章