0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

VBScriptでACCESSに選択クエリを書くときのワイルドカードはパーセント

Last updated at Posted at 2016-12-01

VBScript でアクションクエリをやるというのはよくありますが、選択クエリを実行した例はありません。
なぜでしょうか。
それはワイルドカードが原因のようです。
普通はアスタリスクなのにどういうわけかパーセント記号なのです。
わかるわけないだろうそんなこと。

Use the Like Operator to Simplify Your WQL Queries

確かに例はあるけど、これも違うし。

Transact-SQL リファレンス (データベース エンジン)
Transact-SQL は、SQL Server を使用する場合に中心となる機能です。 SQL Server のインスタンスと通信するすべてのアプリケーションは、アプリケーションのユーザー インターフェイスに関係なく、サーバーに Transact-SQL ステートメントを送信して通信を行います。
ADO、OLE DB、ODBC などのデータベース API を使用する、Microsoft Visual C++、Microsoft Visual Basic や Microsoft Visual J++ などの開発システムを使用して作成されるアプリケーション。
LIKE (Transact-SQL)

%

0 個以上の文字で構成される任意の文字列です。
WHERE title LIKE '%computer%' と指定すると、書籍名に "computer" という単語が含まれるすべての書籍が検索されます。

_ (アンダースコア)

意の 1 文字です。
WHERE au_fname LIKE '_ean' と指定すると、ean で終わる 4 文字のすべての名 (Dean、Sean など) が検索されます。

[ ]

指定した範囲 ([a-f]) またはセット ([abcdef]) 内にある任意の 1 文字です。
WHERE au_lname LIKE '[C-P]arsen' と指定すると、Carsen、Larsen、Karsen などのように、姓が C から P の間にある任意の 1 文字で始まり、arsen で終わる著者が検索されます。 範囲で検索する場合、照合順序の並べ替え規則に応じて範囲に含まれる文字が変わります。

[^]

指定した範囲 ([^a-f]) またはセット ([^abcdef]) 内にない任意の 1 文字です。
WHERE au_lname LIKE 'de[^l]%' と指定すると、姓が de で始まり、次の文字が l ではないすべての著者が検索されます

この記述からすると、ワイルドカード文字は*だけではなく%記号やアンダーバーもワイルドカード文字としてマイクロソフトは考えているようだ。

ともあれスクリプトを

以下のスクリプトは
(マイ)ドキュメントフォルダにDatabase2.accdbがあり、
T_CSV というテーブルにF02業者名 という列があったら検索するというもの。
結果はFSOで出力します。

AccessSelectQuery
Const sFileFolder = "C:\Users\name\Documents"
Const sDbName = "Database2.accdb"
Const adOpenDynamic = 2
Const adLockOptimistic = 3
'ADODB.Connection
Dim cn: Set cn = CreateObject("ADODB.Connection")
Dim Rs: Set Rs = CreateObject("ADODB.RecordSet")
Dim FSO: Set FSO = CreateObject("Scripting.FileSystemObject")
Dim I, sSQL, sFolder, sFileName, s, CNT
sFolder = FSO.GetParentFolderName(WScript.ScriptFullName)
sFileName = sFolder & "\" & "SQLResult.log"
FSO.CreateTextFile sFileName, True
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & sFileFolder & "\" & sDbName & ";"
sSQL = "SELECT * From T_CSV Where (((F02業者名) like '%松%'));"
Rs.CursorType = adOpenDynamic
Rs.LockType = adLockOptimistic
Set Rs = cn.Execute(sSQL)

If Rs.EOF = False Then
If Rs.BOF = False Then
With FSO.OpenTextFile(sFileName, 2, True)
    On Error Resume Next
      .WriteLine "ヘッダー項目をカンマで区切って入力"
    'SELECT文の結果が複数の場合、ループする
    Do Until Rs.EOF = True
      s = ""
      For I = 0 To Rs.Fields.Count - 1
      s = s & Rs.Fields(I) & ","
      Next
      .WriteLine s
'Safty Counter
    If CNT < 20 Then CNT = CNT + 1 Else Exit Do
    Rs.MoveNext
    Loop
End With
End If
End If
Set cn = Nothing: Set Rs = Nothing: Set FSO = Nothing
WScript.ECho "Finish"

参考####

WSHでスクリプトファイル自身が存在するフォルダパスを取得する
Open、Close メソッドの例 (VBScript)
Access Connection Strings
VBScriptでデータベースに接続してCSV出力
まだまだ使える! WSHプログラミング ~ データベースを扱う共通モジュールの紹介

0
2
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
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?