gpt4 book ai didi

sql-server - 在批处理文件中使用 SQLCMD,如何解析响应并检查错误?

转载 作者:行者123 更新时间:2023-12-01 22:30:57 25 4
gpt4 key购买 nike

我正在使用 SQLCMD 获取表中的行数,但我也想知道查询是否遇到错误。

我正在使用的 sqlcmd 如下所示:

sqlcmd -S %server% -U %user% -P %pass% -b -Q "select count(*) from %table%"

如果成功,它将返回:

-----------
10205

(1 rows affected)

(请注意,在我未指定的列名称 ------ 上方有一个空行。)

如果我传入一个不存在的表,我会得到以下响应:

Msg 208, Level 16, State 1, Server devServer, Line 1
Invalid object name 'dbo.no_table'.

因为我有 -b 标志,所以我可以检查 ERRORLEVEL 的值(在本例中为 1)。

为了存储计数变量,我一直在使用以下行:

for /F %%i in ('sqlcmd -S %server% -U %user% -P %pass% -b -Q "select count(*) from %table%" ^| findstr /r "[^(][0-9]"') do SET /a rec_count=%%i

在for之后,%errorlevel%返回0。即使在do里面,errorlevel也是0。

有什么简单的方法可以运行 sqlcmd,如果没有错误则存储计数,如果有错误则打印两行?

最佳答案

由 FOR/F 执行的命令通过新的 CMD session 隐式执行。例如,使用 for/f %a in ('echo hello') do ...,执行的命令变为 C:\Windows\system32\cmd.exe/c echo你好

您的命令正确设置了 ERRORLEVEL,但是一旦子 CMD session 终止并且控制返回到您的批处理脚本,该值就会丢失。

所以 /b 选项实际上对您没有任何好处,可以删除。

您可以通过添加 -h -1 选项来抑制 header 信息。

您可以通过在命令前加上set nocount on;

来抑制 (1 rows affected) 消息

您可以添加 -r 1 选项使错误消息出现在 stderr 而不是 stdout 上。这将阻止 FOR/F 处理任何错误,并且错误消息将出现在屏幕上。

您可以在执行命令之前清除 rec_count 变量。如果有错误,它将保持未定义状态,否则如果没有错误,它将包含计数。

set "rec_count="
for /f %%A in (
'sqlcmd -S %server% -U %user% -P %pass% -h -1 -r 1 -Q "set nocount on;select count(*) from %table%"'
) do set "rec_count=%%A"
if not defined rec_count echo There was an error!

您可能会考虑的另一件事是将 SQLCMD 识别的环境变量用于您的服务器、用户名和密码。这样您就不必使用 -S、-U 或 -P 选项。如果您的批处理脚本运行许多 SQLCMD 命令,这将特别方便。

set "sqlcmdServer=YourServer"
set "sqlcmdUser=YourUserName"
set "sqlcmdPassword=YourPassword"

set "rec_count="
for /f %%A in (
'sqlcmd -h -1 -r 1 -Q "set nocount on;select count(*) from %table%"'
) do set "rec_count=%%A"
if not defined rec_count echo There was an error!

关于sql-server - 在批处理文件中使用 SQLCMD,如何解析响应并检查错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29549178/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com