SQL INSERT 文の生成コマンドレット

Make-DB-Insert コマンドレット(n列版)

Param( $tableName ) Function Get-Current-Path { return $MyInvocation.PSScriptRoot } if( $tableName -eq $Null ) { Write-Host '引数「テーブル名」が指定されていません。' return } $path = Get-Current-Path # Import-Module ('{0}\DB-Table-{1}.psm1' -f $path ,$tableName) . ('{0}\DB-Table-{1}.ps1' -f $path ,$tableName) # 行頭のシングルクォーテーションを削除する正規表現 $rg = [System.Text.RegularExpressions.Regex]::new( '^''' ) $fnColumnNames = { Param( $str ) return $str }.GetNewClosure() $fnValues = { Param( $str ) # 行頭のシングルクォーテーションを削除 $str = $rg.Replace( $str, '' ) # ダブルクォーテーションをシングルクォーテーションに置換 $str = $str.Replace( '"', '''' ) return $str }.GetNewClosure() Function To-Line { Param( $fn ) Begin { $line = [System.Text.StringBuilder]::new() $chSeparator = '' } Process { $str = & $fn $_ [void] $line.Append( $chSeparator + $str ) $chSeparator = ',' } End { $line.ToString() } } Function A { Param( [System.Collections.Generic.List[System.Text.StringBuilder]] $stringBuilders, $chSeparator ) Begin { $i = 0 } Process { $str = & $fn $_ if( $stringBuilders.Count -le $i ) { [void] $stringBuilders.Add( [System.Text.StringBuilder]::new() ) } [void] $stringBuilders[$i ++].Append( $chSeparator + $str ) } } Function MultiColumns-To-Line { Param( $fn ) Begin { $list = [System.Collections.Generic.List[System.Text.StringBuilder]]::new() $chSeparator = '' $lineIndex = 0 } Process { $strInput = [String] $_ $Values = $strInput.Split( "`t" ) $Values | A $list $chSeparator $chSeparator = ',' } End { $list } } Function Resetup-Clipboard { $text = Get-Clipboard -Format Text -Raw if( $text -eq $Null ) { return $False } $rg = [System.Text.RegularExpressions.Regex]::new( '\r\n$' ) $rg.Replace($text, '') | Set-Clipboard return $True } $r = Resetup-Clipboard if( $r -eq $False ) { Write-Host 'error: 列の値がコピーされていません。' return } $clipboardValues = Get-Clipboard $l = $clipboardValues.Count $r = $columnNames.Count if( $l -ne $r ) { Write-Host ('warning: 列数({0})と値の数({1})が一致してません。' -f $l ,$r) } $lineColumnNames = $columnNames | To-Line $fnColumnNames $lineValues = $clipboardValues | MultiColumns-To-Line $fnValues $lineValues | %{ 'INSERT INTO {0} ({1}) VALUES ({2});' -f $tableName ,$lineColumnNames ,$_ }

Make-DB-Insert コマンドレット(一列版)

# DB テーブル USER_INF を例に記す。 # # DB-Table-USER_INF.psm1 を用意する。内容は以下となる。 # # # テーブル名 # $tableName = 'USER_INF' # # # 列名 # $columnNames = @( # 'A'; # 'B'; # 'C'; # ) # # クリップボードに以下のような行をコピーする。 # 35 # "Mike" # NULL # # 実行。テーブル名を指定する。 # PS> Make-DB-Insert USER_INF Param( $tableName ) Function Get-Current-Path { return $MyInvocation.PSScriptRoot } if( $tableName -eq $Null ) { Write-Host '引数「テーブル名」が指定されていません。' return } $path = Get-Current-Path Import-Module ('{0}\DB-Table-{1}.psm1' -f $path ,$tableName) # 行頭のシングルクォーテーションを削除する正規表現 $rg = [System.Text.RegularExpressions.Regex]::new( '^''' ) $fnColumnNames = { Param( $str ) return $str }.GetNewClosure() $fnValues = { Param( $str ) # 行頭のシングルクォーテーションを削除 $str = $rg.Replace( $str, '' ) # ダブルクォーテーションをシングルクォーテーションに置換 $str = $str.Replace( '"', '''' ) return $str }.GetNewClosure() Function To-Line { Param( $fn ) Begin { $line = [System.Text.StringBuilder]::new() $chSeparator = '' } Process { $str = & $fn $_ [void] $line.Append( $chSeparator + $str ) $chSeparator = ',' } End { $line.ToString() } } $clipboardValues = Get-Clipboard $l = $clipboardValues.Count $r = $columnNames.Count if( $l -ne $r ) { Write-Host ('列数({0})と値の数({1})が一致してません。' -f $l ,$r ) } $lineColumnNames = $columnNames | To-Line $fnColumnNames $lineValues = $clipboardValues | To-Line $fnValues 'INSERT {0} ({1}) VALUES ({2});' -f $tableName ,$lineColumnNames ,$lineValues