SSIS 數據類型和類型轉換

在進行ETL開發時,數據類型(Data Type)是最基礎的,但也容易被忽略,樓主使用的SQL Server 版本是2012,用此博文記錄,經常使用的SSIS數據類型和TSQL數據類型的映射。SSIS的數據類型,是指數據流組件使用的數據類型和變量的數據類型(Data Flow 和 Variable)。html

當數據進入Package的data flow task中時,SSIS 經過數據源組件從數據源抽取(extract)數據,獲取元數據類型,並轉換成SSIS支持的數據類型,SSIS的數據類型主要分爲三類:字符(string),數值(numeric)和日期/時間(date/time),若是源數據相似不能轉換成相應的SSIS 數據類型,SSIS Engine就會報錯。SSIS的數據類型,以「DT_」開頭,是Data Type的簡寫。sql

一,SSIS 數據流的數據類型和TSQL數據類型的映射express

1,字符類型app

字符類型用於存儲字符串,在SQL Server中,使用單引號表示一個字符,可是在SSIS中,使用雙引號表示一個字符串。函數

SSIS的字符類型和TSQL的數據類型的對應關係:post

  • DT_STR:對應TSQL的 varchar, char
  • DT_WSTR:對應TSQL的 nchar, nvarchar, xml

2,數值類型性能

數值類型分爲整數和小數,SSIS的整數類型和TSQL數據類型的對應關係:ui

  • DT_BOOL:bit
  • DT_UI1:tinyint,佔用一個字節,非負整數,數值範圍是:0-255
  • DT_I2:smallint,佔用2個字節,有符號整數
  • DT_I4:int,佔用4個字節,有符號整數
  • DT_I8:bigint,佔用8個字節,有符號整數
  • DT_BYTES:binary, varbinary, RowVersion

TSQL的小數數值類型分爲兩類:精確小數(decimal)和近似小數(float),小數也叫實數(real),SSIS的小數類型和TSQL數據類型的對應關係:lua

  • DT_NUMERIC:精確小數,decimal
  • DT_R4:近似小數,float(24)
  • DT_R8:近似小數,float(53)

3,日期時間類型url

SSIS的日期時間類型和TSQL數據類型的對應關係:

  • DT_DBDATE:date
  • DT_DBTIME2:time(p)
  • DT_DBTIMESTAMP:datetime
  • DT_DBTIMESTAMP2:datetime2

SSIS 內置函數:GETDATE() 和 GETUTCDATE() 返回值的數據類型是DT_DBTIMESTAMP,對應TSQL的DateTime,所以,只保留3位毫秒。在Expression Builder中,將時間類型轉換成字符串類型,顯示的毫秒數有效數值只有3位,末尾補6個0,共9位:

  • (DT_WSTR,30) GETDATE(),Evaluated Value是:2016-10-13 17:04:01.765000000
  • (DT_DBTIMESTAMP2,7) GETDATE(),Evaluated Value是:10/13/2016 5:01:54 PM

二,SSIS 變量(Variable)的數據類型和TSQL數據類型的映射

SSIS 變量的數據類型,不一樣於SSIS的數據類型,但都和SSIS的數據類型相兼容,在進行表達式求值時,SSIS自動將變量的數據類型隱式轉換成SSIS的數據類型,而後進行求值。

Variables have a Variant data type and the expression evaluator converts the data type of a variable from a Variant subtype to an Integration Services data type before it evaluates the expression. 

1,字符數據類型

字符變量和TSQL數據類型的映射關係:

  • String:char,nchar,varchar(n),nvarchar(n)
  • object:varchar(max),nvarchar(max)

2,數值類型

數值類型的變量和TSQL數據類型的映射關係:

  • Boolean:bit
  • Int64:bigint
  • Int32:int
  • Int16:smallint
  • Byte:tinyint
  • object:binary, varbinary(n), varbinary(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

三,強制類型轉換

SSIS在進行表達式求值時,自動將一個數據類型隱式轉換成相兼容的另一個數據類型,若是類型不兼容,必須強制類型轉換,不然,SSIS報錯。對數據進行強制類型轉換的格式是:(type) expression,在進行顯式類型轉換時,儘可能使用窄的數據類型,這樣可以提升數據傳輸的速度;可是,數據轉換須要付出必定的代價,所以,必須權衡類型轉換和數據傳輸對性能的影響。

An implicit conversion of a data type occurs when the expression evaluator automatically converts the data from one data type to another. If the data in a column does not require the full width allocated by the source data type, you might want to change the data type of the column. Making each data row as narrow as possible helps optimize performance when transferring data because the narrower each row is, the faster the data is moved from source to destination.

1,將字符串轉換成TSQL的日期/時間類型

在SSIS中,字符串常量使用雙引號「」,[] 表示可選:

  • 轉換成date:(DT_DBDATE)"yyyy-mm-dd"
  • 轉換成time(n):(DT_DBTIME2,n)"hh:mm:ss[.fffffff]"
  • 轉換成datetime:(DT_DBTIMESTAMP)"yyyy-mm-dd hh:mm:ss[.fff]"
  • 轉換成datetime2(n):(DT_DBTIMESTAMP2,n)"yyyy-mm-dd hh:mm:ss[.fffffff]"

2,轉換成字符串

字符串分爲雙字節字符和單字節字符,對於單字節字符,SSIS使用 DT_STR 表示,在強制類型轉換時,必須制定code page和字符長度:

  • 將整數5轉換爲單字節字符:(DT_STR,30,1252)5
  • 將整數5轉換爲雙字節字符:(DT_WSTR,30)5
  • 將 DT_DBTIMESTAMP 類型轉換成字符串:(DT_WSTR,30)GETDATE(),返回的數據格式是: 2016-10-13 14:55:31.248000000,GETDATE()返回的數據類型是DT_DBTIMESTAMP;

3,數值類型轉換

  • 將字符串轉換成bit:(DT_BOOL)"True"
  • 將小數轉換成int:(DT_I4) 3.57
  • 將整數轉化成精確小數:(DT_NUMERIC,7,3)4000

四,數據類型轉換的性能

將數據從一個SQL Server 加載到另外一個SQL Server以前,若是須要轉換數據類型,建議使用TSQL Conversion,這樣,能簡化Package的設計,提升轉換速度。

五,參數的數據類型

在Execute SQL Task引用變量時,必須在Parameter Mapping Tab中設置參數的Data Type,請參考《Execute SQL Task 參數和變量的映射

 

參考文檔:

Integration Services (SSIS) Expressions

Cast (SSIS Expression)

Integration Services Data Types

SQL Server Integration Services, Data Type Mapping

Performance Comparison between Data Type Conversion Techniques in SSIS 2008

相關文章
相關標籤/搜索