SQLServer テーブル定義の取得
Excel のデータを読んで SQLSerevr 上のテーブルを更新する
テーブル定義 取得用 SQL
lesson011.sql
select
c.column_name
, c.data_type
from
information_schema.columns c
where
( c.table_name = '%table_name%' )
order by
c.ordinal_position
接続文字列
lesson004.con
DRIVER={SQL Server};SERVER=xxxxxx;DataBase=adventureworksdw;UID=yyyyyy;PWD=zzzzzz;
テーブル更新用スクリプト
lesson011.vbs
Private fs Set fs = CreateObject("Scripting.FileSystemObject") 'SQLServer 接続文字列 読み込み Private tsCon Set tsCon = fs.OpenTextFile(WScript.Arguments(0)) Private sCon: sCon = "" If Not tsCon.AtEndOfStream Then sCon = tsCon.ReadLine End If tsCon.Close Set tsCon = Nothing 'SQLServer 接続 Private cnSqlServer Set cnSqlServer = CreateObject("ADODB.Connection") With cnSqlServer .Provider = "SQLOLEDB" .ConnectionString = sCon .Open End With 'テーブル定義情報 取得用 SQL 読み込み Private tsSql Set tsSql = fs.OpenTextFile(WScript.Arguments(1)) Private sSql: sSql = "" Do Until tsSql.AtEndOfStream sSql = sSql & tsSql.ReadLine & vbNewLine Loop tsSql.Close Set tsSql = Nothing Set fs = Nothing 'テーブル名を指定 Dim tableName: tableName = WScript.Arguments(2) sSql = Replace(sSql, "%table_name%", tableName) Dim rsSqlServer Set rsSqlServer = CreateObject("ADODB.Recordset") With rsSqlServer .ActiveConnection = cnSqlServer .CursorType = 0 'adOpenForwardOnly .LockType = 1 'adLockReadOnly .Source = sSql .Open End With Dim fieldCount: fieldCount = -1 Dim fieldNames() Dim fieldTypes() Dim constraints() If Not rsSqlServer.EOF Then Do Until rsSqlServer.EOF fieldCount = fieldCount + 1 ReDim Preserve fieldNames(fieldCount) ReDim Preserve fieldTypes(fieldCount) fieldNames(fieldCount) = rsSqlServer.Fields("column_name").Value & "" fieldTypes(fieldCount) = rsSqlServer.Fields("data_type").Value & "" rsSqlServer.MoveNext Loop End If rsSqlServer.Close 'Excel 接続 Dim cnExcel' as ADODB.Connection Set cnExcel = CreateObject("ADODB.Connection") With cnExcel .Provider = "Microsoft.Jet.OLEDB.4.0" .ConnectionString = "Data Source=" & WScript.Arguments(3) & ";" & "Extended Properties=Excel 8.0;" .CursorLocation = 3' adUseClient .Open End With 'Excel 読み込み Dim rsExcel' As ADODB.Recordset Set rsExcel = CreateObject("ADODB.Recordset") With rsExcel .Source = "SELECT * FROM [" + WScript.Arguments(4) + "$]" .Activeconnection = cnExcel .CursorType = 0' adOpenForwardOnly .LockType = 1' adLockReadOnly .Open End With Do Until rsExcel.EOF sSql = "MERGE_" & tableName & vbNewLine For i = 0 To rsExcel.Fields.Count - 1 If i <= fieldCount Then If i = 0 Then sSql = sSql & " " Else sSql = sSql & ", " End If Select Case fieldTypes(i) Case "nvarchar", "nchar", "varchar", "char" sSql = sSql & "'" & rsExcel.Fields(i).Value & "'" & vbNewLine Case "datetime", "smalldatetime" If rsExcel.Fields(i).Value & "" = "" Then sSql = sSql & "NULL" & vbNewLine Else sSql = sSql & "'" & rsExcel.Fields(i).Value & "'" & vbNewLine End If Case Else If rsExcel.Fields(i).Value & "" = "" Then sSql = sSql & "NULL" & vbNewLine Else sSql = sSql & rsExcel.Fields(i).Value & vbNewLine End If End Select End If Next cnSqlServer.Execute sSql rsExcel.MoveNext Loop rsExcel.Close Set rsExcel = Nothing 'Excel 切断 cnExcel.Close Set cnExcel = Nothing 'SQLServer 切断 cnSqlServer.Close Set cnSqlServer = Nothing
実行形式
C:\>cscript c:\study\vbscript\chapter006\lesson011.vbs c:\study\vbscript\chapte
r006\lesson004.con c:\study\vbscript\chapter006\lesson011.sql DimAccount c:\stud
y\vbscript\chapter006\lesson007.xls Sheet1 //nologo
実行イメージ
MERGE_DimAccount
1
, NULL
, 1
, NULL
, 'Balance Sheet'
, ''
, '~'
, ''
, 'Currency'
, ''MERGE_DimAccount
2
, 1
, 10
, 1
, 'Assets'
, 'Assets'
, '+'
, ''
, 'Currency'
, ''MERGE_DimAccount
3
, 2
, 110
, 10
, 'Current Assets'
, 'Assets'
, '+'
, ''
, 'Currency'
, ''...