- 追加された行はこの色です。
- 削除された行はこの色です。
* ODBC経由でSQL文実行 [#bb8824ee]
-ページ: [[Macro/投稿]]
-作者: [[t_ishida]]
-カテゴリー: js
-投稿日: 2008-02-05 (火) 20:14:26
** メッセージ [#ze61a2e6]
#code(javascript){{
/***************************************************************************************************
* SQLのなんか.js
* 概要
* エディタの中でODBCでDBにつないでSQL文を実行したり、レコードを取得したりを出来る。
* DAO3.6が無いと使えない
* うん、はじめてサクラエディタのマクロって作ったが、Emacs系のマクロAPIの便利さが身にしみてよく分かる。
* @ver 0.0.0.1
***************************************************************************************************/
//
// 環境設定部
//
//DBのユーザー名
var us = "";
//パスワード
var ps = "";
//使うDB
var db = "";
//ODBCデータソース名
var dsn = "";
var cn_str = "ODBC" +
";DSN=" + dsn +
";UID=" + us +
";PWD=" + ps +
";DB=" + db;
// 実行結果の出力先(現在はcurrentしか選べん)
//var output = 'other';
var output = 'current';
//currentの時、出力結果を毎度書き換えるかどうか(y/n)
var clear_prevoutput = 'y';
//実行後に現在の行に戻るかどうか?(y/n)
var return_current_line = 'y';
//DAOをnew ActiveXObjectするための文字列
var DAO = "DAO.DBEngine.36";
//DAOのデータタイプ
var dat_type = {
//数値
16 : "数値", 9 : "数値", 1 : "数値" ,
2 : "数値", 5 : "数値", 17 : "数値" ,
20 : "数値", 7 : "数値", 21 : "数値" ,
15 : "数値", 3 : "数値", 4 : "数値" ,
11 : "数値", 19 : "数値", 6 : "数値" ,
//日付
22 : "日付" , 23 : "日付" , 8 : "日付" ,
//文字列
12 : "文字列", 10 : "文字列" , 18 : "文字列"
};
var db_type = 'sqlserver';
var cmd_query = [
'@tab' ,
'@col'
];
var commands = {
'@tab' : showTables ,
'@col' : showColumns
};
var cmd_styntax = new RegExp( '^(' + cmd_query.join('|') + ')', 'i');
//SELECT系のシンタックスを正規表現で指定
var query_syntax = [
'select .+(?: from)?'
];
var sql_query = new RegExp('^(?:' + query_syntax.join('|') + ')', 'i');
//実行系のシンタックスを正規表現で指定
var no_query_syntax =[
'select .+ into' ,
'update .+ set' ,
'insert into' ,
'create index' ,
'create table' ,
'alter table' ,
'drop table' ,
'delete from' ,
'truncate table ' ,
'bulk insert' ,
];
var sql_no_query = new RegExp('^(?:' + no_query_syntax.join('|') + ')', 'i');
//////////////////////////////////////////////////////////////////////////////////
// 処理部 => こっから下はやる気のある人以外は触ったらイヤン
//////////////////////////////////////////////////////////////////////////////////
var st_no = ExpandParameter('$y') - 0;
var st_col = ExpandParameter('$x') - 0;
// 出力先の変更(バージョン1.15.11からしか、TraceOutは使えないらしいので現在は無意味)
var say;
if( output == 'other') {
ActivateWinOutput();
say = function(s){ TraceOut(s,1); };
} else {
say = function(s){ InsText(s + "\r\n"); };
}
var param;
if( IsTextSelected() ){
param = GetSelectedString();
BeginSelect();
} else {
for( var i=1; i <= GetLineCount(0); i++ ) {
param += GetLineStr(i);
}
}
param = param.replace( /^\s*--.*(\r\n|\r|\n)/, "" ).replace( /(?:\r\n|\r|\n| +)/g, " " );
if( GetLineCount(0) == ExpandParameter("$y") ){ GoFileEnd(0); say("\n\n"); Jump(st_no); }
if( output == "current" && clear_prevoutput == "y" ){
SearchNext("@---- SQL");
if ( !IsTextSelected() ) {
while( GetLineStr(0) != '' ) {
Down(0);
if( GetLineCount(0) == ExpandParameter( "$y" ) ) break;
}
} else {
GoLineTop(0);
while( !GetLineStr(0).match(/@---- __END__ ----@/) ){
Down_Sel();
if( GetLineCount(0) == ExpandParameter( "$y" ) ) break;
}
if ( GetLineStr(0).match(/@---- __END__ ----@/) ) {
Delete();
DeleteLine();
}
}
}
var dbe = new ActiveXObject( DAO );
var ws = dbe.CreateWorkspace( "", "", "", 1 );
var cn;
try {
cn = ws.OpenConnection( "", 3, false, cn_str );
} catch(e){
say( "接続エラー:" + e.message );
say( "繋がらないから設定確認して" );
throw(e);
}
var arr_sql = param.split(";");
ws.BeginTrans();
say( "@---- SQLを実行するよ(select系以外は何も出なけりゃ成功だよ) ----@" );
for(var i = 0; i < arr_sql.length; i++ ){
var s = arr_sql[i].replace( /^\s*(.+)$/, "$1" );
if( s.match( /^\s+$/ ) ) continue;
try {
if ( s.match( cmd_styntax ) ) say( commands[RegExp.$1]( s, cn ) );
else if ( s.match( sql_query ) ) say( getRecordTable( s, cn ) );
else if ( s.match( sql_no_query ) ) cn.Execute( s );
else continue;
} catch(e) {
ws.Rollback();
say( "SQL実行エラー(ろーるばっくしたよ):" );
if( dbe.Errors.Count ){
for( var i = 0; i < dbe.Errors.Count; i++ ){
say( "\t" + dbe.Errors(i).Description );
}
} else {
say( "\t" + e.message );
}
say( "駄目だったやつ:");
say( "\t" + s );
break;
}
say("");
}
say( "@---- __END__ ----@" );
ws.CommitTrans();
cn.Close();
if ( return_current_line == 'y' ) Jump( st_no );
else GoFileEnd( 0 );
function getRecordTable( s, cn ){
var rs;
var ret = '';
rs = cn.OpenRecordSet( s, 2 );
if( rs.EOF ) return '取れなかったよ';
rs.MoveLast();
if ( ( rs.RecordCount * rs.Fields.Count ) > 30000 ) {
rs.Close();
return 'そんなにいっぱい書けないっす(^_^;)'
}
rs.MoveFirst();
var ln = '';
var fld = null;
for( var i = 0; i < rs.Fields.Count; i++ ) {
if ( ln ) ln += "\t";
fld = rs.Fields.Item(i);
ln += fld.Name + "(" + dat_type[fld.Type] + ")";
}
ret = ln + "\r\n";
while( rs.EOF == false ){
ln = '';
for( var i=0;i < rs.Fields.Count; i++ ){
if ( ln ) ln += "\t";
fld = rs.Fields.Item(i);
if ( fld.Value == null ) ln += "NULL";
else if ( dat_type[fld.Type] == '日付' ) ln += formatDate(fld.Value);
else ln += fld.Value;
}
ret += ln + "\r\n";
rs.MoveNext();
}
rs.Close();
return ret;
}
function formatDate(src){
var dd = new Date(src);
var y = dd.getYear(), m = dd.getMonth() + 1, d = dd.getDate();
var h = dd.getHours(), mi = dd.getMinutes(), s = dd.getSeconds();
if ( y < 2000 ) y += 1900;
if ( m < 10 ) m = "0" + m;
if ( d < 10 ) d = "0" + d;
if ( h < 10 ) h = "0" + h;
if ( mi < 10 ) mi = "0" + mi;
if ( s < 10 ) s = "0" + s;
return y + "/" + m + "/" + d + " " + h + ":" + mi + ":" + s;
}
function showTables( cmd, cn ){
var tab_nm = '';
if( cmd.match( /like +(\S+)$/i ) ) tab_nm = RegExp.$1;
var s = {
'sqlserver' : function(){
var x = "select o.name as tab_name from sysobjects o where o.name like @param@ order by o.id";
if( tab_nm ) x = x.replace( /@param@/, tab_nm );
else x = x.replace( /where .+ order by/, "order by" );
return x;
}
}[db_type]();
return getRecordTable( s, cn );
}
function showColumns( cmd, cn ){
var col_nm = '' , tab_nm = '';
if ( cmd.match( / tab +like +(\S+)/i ) ) tab_nm = RegExp.$1;
if ( cmd.match( /col +like +(\S+)/i ) ) col_nm = RegExp.$1;
var s = {
'sqlserver' : function(){
var x = "select " +
" o.name as tab_name " +
", c.colorder as col_no " +
", c.name as col_nm " +
", t.name as type_nm " +
", c.length as col_len " +
", p.value as col_com " +
"from " +
" sysobjects o " +
", syscolumns c " +
", systypes t " +
", sysproperties p " +
"where " +
" o.id = c.id " +
"and o.id *= p.id " +
"and c.xtype = t.xtype " +
"and c.colorder *= p.smallid " +
"and o.xtype = 'U' " +
"and p.type = 4 " +
"and o.name like @param1@ " +
"and c.name like @param2@ " +
"order by " +
" o.id , " +
" c.colorder";
if ( tab_nm ) x = x.replace( /@param1@/i, tab_nm );
else x = x.replace( /and +o.name +like +@param1@/,' ');
if ( col_nm ) x = x.replace( /@param2@/i, col_nm );
else x = x.replace( /and +c.name +like +@param2@/,' ');
return x;
}
}[db_type]();
return getRecordTable( s, cn );
}
}}