SSIS 數據類型 第二篇:變數的數據類型

變數(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