2010年3月28日日曜日

Windows Power Shellから、SQL-Server 2008 Expressの関数を利用する!!



今回の記事では、Windows Power Shellから、SQL-Server 2008 Expressの関数を利用する方法について書かせて頂きます。

Windows Power Shellは、対話式で利用が出来るので、超が何個もつく高機能電卓とか、使い方が無限に広がります。
さらに、SQL-Server 2008 Expressの関数も使えたら、さらに便利ですよね。

もちろん、いきなりは使えないので、使えるようにする関数を自作してみます。
関数名が長いと不便なので、「Q」の一文字だけにしてみます。

関数「Q」を作ってしまえば、Q "クエリー" だけでOKになります。

たとえば、文字列をバイト単位で切り出してくる関数ですが、以前、このブログで、SQL-Server 2008向けに作らせて頂いた「SQLCLR_SubStringB()関数」を、そのままWindows Power Shellでも使えるようになったしますよ。


■関数の中身■

function global:Q([string]$p_sql = "")
{
#----------------------------
#変数定義
#----------------------------
[Data.SqlClient.SqlConnection]$obj_con = $null;
[Data.SqlClient.SqlCommand]$obj_cmd = $(New-Object Data.SqlClient.SqlCommand);
[object]$obj_result = $null;
[Regex]$obj_rx = $null;

try
{
#クエリーの種類をチェック
$obj_rx = $(New-Object Regex("INSERT|UPDATE|DELETE|TRUNCATE|INTO|EXEC"));
if($obj_rx.IsMatch($p_sql))
{
throw $("実行出来ない種類のクエリーが記述されています。");
}

#SELECTが記述されていない場合は自動付与
$obj_rx = $(New-Object Regex("SELECT"));
if(!($obj_rx.IsMatch($p_sql)))
{
$p_sql = "SELECT " + $p_sql;
}

$obj_con =
$(New-Object Data.SqlClient.SqlConnection("Data Source=Aspire1410\sqlexpress;
User Id=xxxx;Password=xxxxx;"));
$obj_con.Open();
$obj_cmd.CommandType = 1; #Text
$obj_cmd.CommandText = $p_sql;
$obj_cmd.Connection = $obj_con;
$obj_result = $obj_cmd.ExecuteScalar();

}
catch [Exception]
{
Write-Output $($Error[0].ToString());
}
finally
{
if($obj_con -ne $null)
{
$obj_con.Close();
$obj_con.Dispose();
}
$obj_cmd.Dispose();
}
return $obj_result;
}