LoginSignup
2
0

More than 5 years have passed since last update.

vbs でSQLServer から ADODBでデータを引っ張ってきたときに ハマった話

Last updated at Posted at 2018-08-21

発生した環境

Server WindowsServer2012R2
SQL SERVER 2012

はじめに

夜中に vbsやbatを走らせてデータを集計することよくありますよね。
メモ帳 Terapad等でささっとかいて業務改善

今回は1日1回 SQLでSELECTして該当した人にメールを飛ばすvbsです。
わけ合って、SchduleTableを as A と as B として2回joinしてますが、今回の事象とは無関係かと思います。

vbs

sample.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方法です。

error.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  ,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

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0