発生した環境
Server WindowsServer2012R2
SQL SERVER 2012
はじめに
夜中に vbsやbatを走らせてデータを集計することよくありますよね。
メモ帳 Terapad等でささっとかいて業務改善
今回は1日1回 SQLでSELECTして該当した人にメールを飛ばすvbsです。
わけ合って、SchduleTableを as A と as B として2回joinしてますが、今回の事象とは無関係かと思います。
vbs
Set objWshShell = CreateObject("WScript.Shell")
Set OBJa = CreateObject("ADODB.Connection")
OBJa.Open "Provider=SQLOLEDB;User ID=idPassword=passwordr;Initial Catalog=cadi;Data Source=db"
SQLQuery ="SELECT A.EMAILADDRESS as to_email ,B.EMAILADDRESS as cc_email,B.USERNAME as displayname "
SQLQuery =SQLQuery & "FROM (Table1 LEFT JOIN Table2 ON Table1.s_id = Table2.ID LEFT JOIN SchduleTable AS A ON A.USERNAME = Table1.huga) "
SQLQuery =SQLQuery & "LEFT JOIN SchduleTable AS B ON B.FULLNAME = Table2.hunsu "
SQLQuery =SQLQuery & "WHERE huga ='joken'"
Set dr = OBJa.Execute(SQLQuery)
'A.EMAILADDRESS as to_email //toのEメールアドレス
'B.EMAILADDRESS as cc_email //ccのEメールアドレス
'B.USERNAME as displayname //氏名
do until dr.eof
'↓デバッグ用のecho
'WScript.Echo dr("to_email") & " " & dr("cc_email") & " " & dr("displayname")
'~~~メールを飛ばす処理をここに書く~~~
dr.movenext
loop
とまあコレだとうまく通ります。
エラーが発生したソースは下記になります。
違いは 5行目 の SELECT方法です。
Set objWshShell = CreateObject("WScript.Shell")
Set OBJa = CreateObject("ADODB.Connection")
OBJa.Open "Provider=SQLOLEDB;User ID=idPassword=passwordr;Initial Catalog=cadi;Data Source=db"
SQLQuery ="SELECT A.EMAILADDRESS ,B.EMAILADDRESS,B.USERNAME "
SQLQuery =SQLQuery & "FROM (Table1 LEFT JOIN Table2 ON Table1.s_id = Table2.ID LEFT JOIN SchduleTable AS A ON A.USERNAME = Table1.huga) "
SQLQuery =SQLQuery & "LEFT JOIN SchduleTable AS B ON B.FULLNAME = Table2.hunsu "
SQLQuery =SQLQuery & "WHERE huga ='joken'"
Set dr = OBJa.Execute(SQLQuery)
do until dr.eof
'ここでエラー
'WScript.Echo dr("A.EMAILADDRESS") & " " & dr("B.EMAILADDRESS") & " " & dr("B.USERNAME")
'~~~メールを飛ばす処理~~~
dr.movenext
loop
違いは as で名前を変えているかどうかだけ。
SQLQuery ="SELECT A.EMAILADDRESS as to_email ,B.EMAILADDRESS as cc_email,B.USERNAME as displayname "
SQLQuery ="SELECT A.EMAILADDRESS ,B.EMAILADDRESS,B.USERNAME "
ADODB の レコードセットで table.column表記で要素をとろうするととれないかもよ!ということです。
長年この構文を使っていたので、動作はmsdn公式で確認する必要ありそうです。
https://msdn.microsoft.com/ja-jp/library/cc376797.aspx