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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM