您需要做的就是修改您的 sql 查询以使用 IN 子句,然后正确格式化您的变量。您还必须在 FOR 循环中使用延迟扩展,因为 %userID% 在解析 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