4

目前我有以下批处理代码来读取 1 个用户名,并在 sql 中使用它

@echo on
cls
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% 
                -i "sqlQuery.sql" -s "," > "\output.csv" -I -W -k

调用的SQL查询如下

SELECT userId, COUNT (*) AS number 
FROM table 
WHERE userId = '$(userID)' 
GROUP BY userId 
ORDER BY userId desc

我正在寻找的是,如果我在文本文件中有一个用户名列表,它将动态地将 WHERE 语句更改为

WHERE userId = '$(userID1)' OR userId = '$(userID2)' etc....
4

2 回答 2

5

我没有太多使用 SQL 脚本,所以我不确定返回是否会导致问题,但这会产生你需要的东西。

我在一个名为 userID.txt 的文件中使用了这个输入:

steve,joe,fred,jason,bill,luke

通过以下代码运行它:

@echo off
setlocal enabledelayedexpansion
set count=0
for /F "tokens=* delims=," %%G in (userID.txt) do call :loop %%G
:loop
if "%1"=="" goto :endloop
set /a count+=1
set userid%count%=%1
SHIFT
goto :loop
:endloop
set totalusers=%count%
set /a totalusers-=1

echo SELECT userId, COUNT (*) AS number FROM table WHERE ( > sqlQuery.sql
set count=0
:where_gen_loop
set /a count+=1
if !count! gtr !totalusers! goto endwhere_gen_loop
echo userId = '$(!userid%count%!)' OR>> sqlQuery.sql
goto where_gen_loop
:endwhere_gen_loop
echo userId = '$(!userid%count%!)'>> sqlQuery.sql
echo ) >> sqlQuery.sql
echo GROUP BY userId ORDER BY userID desc >> sqlQuery.sql

在 sqlQuery.sql 中生成此输出:

SELECT userId, COUNT (*) AS number FROM table WHERE ( 
userId = '$(steve)' OR
userId = '$(joe)' OR
userId = '$(fred)' OR
userId = '$(jason)' OR
userId = '$(bill)' OR
userId = '$(luke)'
) 
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

endlocal
于 2012-04-05T18:28:34.170 回答
4

您需要做的就是修改您的 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
于 2012-04-05T20:12:21.933 回答