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