Public/Get-SQLServerDataTypeFromDataTable.ps1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
function Get-SQLServerDataTypeFromDataTable {
  param([System.Data.DataTable]$table
    ,[string]$columnName)

  $outObj = New-Object PSObject
  $outObj | Add-Member -Type NoteProperty -Name "minValue" -Value 0
  $outObj | Add-Member -Type NoteProperty -Name "maxValue" -Value 0
  $outObj | Add-Member -Type NoteProperty -Name "derivedDataType" -Value 0
  $outObj | Add-Member -Type NoteProperty -Name "derivedSize" -Value 0
  $outObj | Add-Member -Type NoteProperty -Name "derivedFSDataTypeDefinition" -Value 0

  $col =  $table.Columns[$columnName]

  switch ($col.DataType.Name)
  {
    "DateTime" {
      $dataType = '[DateTime]'
      $outObj.derivedDataType = 'DateTime'
      $outObj.derivedFSDataTypeDefinition = $outObj.derivedDataType
      break
    }

    "String" {
      foreach ($dr in $table.Rows)
      {
        $curRowVal = $dr.Item($columnName)
        $outObj.MinValue = [math]::Min($outObj.MaxValue,$curRowVal.Length);
        $outObj.MaxValue = [math]::Max($outObj.MaxValue,$curRowVal.Length + 1);
      }
      $roundIn = $outObj.MaxValue / 10.0
      $roundOut = [math]::Ceiling($roundIn)
      $outObj.derivedSize = if ($outObj.MaxValue -ge 2147483647) { 'MAX' } else { $roundOut * 20 }
      $outObj.derivedDataType = 'VARCHAR'
      $outObj.derivedFSDataTypeDefinition = "VARCHAR($($outObj.derivedSize))"
      break

    }
    default {
      Write-Log "Defaulting to varchar(max) datatype" Debug
      $outObj.derivedSize = 'MAX'
      $outObj.derivedDataType = 'VARCHAR'
      $outObj.derivedFSDataTypeDefinition = "$($outObj.derivedDataType)($($outObj.derivedSize))"
      break
    }
  }




  Write-Output $outObj
} Export-ModuleMember -Function Get-SQLServerDataTypeFromDataTable