如何编写调用 sqlcmd 的批处理文件来查询 SQL 服务器,如果实例无法访问,它会将服务器名称回显到日志文件中?

How to write a batch file calling sqlcmd to query SQL Server and if instance unreachable, it would echo the server name to a log file?

想法是编写一个批处理文件来对 SQL 个服务器列表执行查询并从中获取一些信息,如果无法访问任何 SQL 个服务器,我想要这个批处理文件将 servername\instancename 写入文本文件供我参考。

我有大约 100 个 SQL 服务器实例(在文本文件中),当我得到结果时,很难知道在批处理文件执行期间哪个实例无法访问。

这是我用来从(在文本文件中列出的)SQL 服务器获取信息的脚本,它有效:

for /F "tokens=*" %%S in (SQLLIST.txt) do sqlcmd -E -h -1 -W -M -S %%S -i C:\Foldername\Query.sql >> Destination\QueryResult.csv -s ","

我想我可能需要添加一个 IF 语句来做到这一点?请帮忙。

注意我在这个设备上没有Sqlcmd,所以无法测试这个。

我会说使用 -b 开关来获取 errorlevel 这应该只是 echo 来筛选实例并且 errorlevel 0 是成功并且 1 是错误的:

@echo off
setlocal enabledelayedexpansion
for /F "tokens=*" %%S in (SQLLIST.txt) do (
    sqlcmd -b -E -h -1 -W -M -S %%S -i C:\Foldername\Query.sql >> Destination\QueryResult.csv -s ","
    echo %%S !errorlevel!
)

因此您可以将其记录到文件中:

@echo off
setlocal enabledelayedexpansion
(for /F "tokens=*" %%S in (SQLLIST.txt) do (
    sqlcmd -b -E -h -1 -W -M -S %%S -i C:\Foldername\Query.sql >> Destination\QueryResult.csv -s ","
    echo %%S !errorlevel!
 )
)2>&1>mysqlcmd.log

或单独记录

@echo off
setlocal enabledelayedexpansion
(for /F "tokens=*" %%S in (SQLLIST.txt) do (
    sqlcmd -b -E -h -1 -W -M -S %%S -i C:\Foldername\Query.sql >> Destination\QueryResult.csv -s ","
    echo %%S !errorlevel!
 )
)2>&1>mysqlcmd.log

或者您可以指定成功或失败:

@echo off
setlocal enabledelayedexpansion
(for /F "tokens=*" %%S in (SQLLIST.txt) do (
    sqlcmd -b -E -h -1 -W -M -S %%S -i C:\Foldername\Query.sql >> Destination\QueryResult.csv -s ","
    if !errorlevel! equ 0 set outp=Success
    if !errorlevel! equ 1 set outp=Failed
    echo %%S !outp!
 )
)2>&1>mysqlcmd.log