SQL クエリを変更して IN 句を使用し、変数を適切にフォーマットするだけです。また、%userID% は FOR ステートメントが解析されるときに 1 回だけ展開されるため、FOR ループ内で遅延展開を使用する必要がありますが、!userID! 各ループ反復の実行時に展開されます。
sqlQuery.sql:
SELECT userId,
COUNT(*) AS number
FROM table
WHERE userId in( $(userID) )
GROUP BY userId
ORDER BY userId desc
バッチ スクリプト:
@echo on
setlocal enableDelayedExpansion
set userID=
for /f %%i in (UserID.txt) do set "userID=!userID!,'%%i'"
sqlcmd -S server -d database -U username -P password -v userID="%userID:~1%" -i "sqlQuery.sql" -s "," > "\output.csv" -I -W -k
sql 変数の定義では、バッチ部分文字列操作を使用して先頭のコンマを削除していることに注意してください。
userID 変数は最終的に次のようになります'userID1','userID2','userID3'
入力ファイル内の ID が多すぎて 8k 環境変数の制限内に収まらない場合は、SQL スクリプトを動的に構築する必要があります。その時点で、sql 変数を削除して、単純に文字列リテラルを使用することもできます。
@echo on
setlocal enableDelayedExpansion
set "delim="
>"sqlQuery.sql" echo SELECT userId, COUNT(*) AS number FROM table WHERE userId in(
for /f %%i in (UserID.txt) do (
>>"sqlQuery.sql" echo !delim!'%%i'
set "delim=,"
)
>>"sqlQuery.sql" echo ) GROUP BY userId ORDER BY userId desc
sqlcmd -S server -d database -U username -P password -i "sqlQuery.sql" -s "," > "\output.csv" -I -W -k