教你解決整理SQL Server輸入的資料

iSQlServer發表於2009-10-27
 

  我當前的專案中包括一個6200萬行、500多列的表。其中的資料來自SQL Server以外,它們到達的表中有一個標識主鍵,所有剩下的列以varchar(50)形式儲存。

  問題解決

  有許多日期以YYYYMMDD格式儲存,這是我注意到的第一個問題。我把這些日期改為整數列。然後我發現許多整數以varchar形式儲存,我把它們都改為整數。

  接下來,許多列中包含“Y”或“N”或NULL。我們很可能會把它們轉換成位列,但這樣做存在一個重大的缺陷——你不能索引一個位列。因此,我把它們改成char(1) NULL。

  此外,還有一些列中儲存有郵政編碼,前面一列為五個數字,後面一列為四個數字或NULL。我將它們分別改成char(5)和char(4),都為NULL。

  我遇到的另外一個問題是,我無法明白相當一部分列中的內容。我把它們單獨處理,為varchar(50)。我希望確定每個varchar列中儲存的字串的最大長度,但要檢查6200萬行中的所有資料中不切實際的。因此,我選擇生成所有列的char或varchar列表。


  SELECT
  COLUMN_NAME, DATA_TYPE,
  CHARACTER_MAXIMUM_LENGTH, IS_NULLABLE
  FROM
  INFORMATION_SCHEMA.COLUMNS
  WHERE TABLE_NAME ='tblArthurClean'
  AND DATA_TYPE IN('char','varchar')

  我複製結果表中的第一列,把它貼上到記事本中(這是我最喜歡的文字編輯器,因為它具有優秀的查詢-替換功能。)要確定一個特定列中的最長資料,使用下列指令碼:


  SELECT Max(Len( ColumnName ))
  FROM TableName

  推而廣之,我希望遍歷列列表並生成我需要的宣告。我把需要的內容集中到一些格式化行中,用一個單獨的查詢來達到這個目的。


  SELECT
  ',Max(Len( ' + COLUMN_NAME + ' ))
  AS ' + COLUMN_NAME
  FROM
  INFORMATION_SCHEMA.COLUMNS
  WHERE TABLE_NAME = 'tblArthurClean'
  AND DATA_TYPE IN( 'char', 'varchar' )

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-617509/,如需轉載,請註明出處,否則將追究法律責任。

相關文章