如何让 SQLcmd.exe 给我一个布尔值输出:如果它找到与查询匹配的任何匹配项,则为“1”;如果未找到任何匹配项,则为“0”?

问题描述 投票:0回答:0

我正在尝试从 Windows 批处理文件 (.bat) 中查询本地 SQL DB,该文件将通过多个调用 UCID 进行迭代,我需要结果采用我可以在批处理文件中以编程方式使用的形式,而不是什么我一直得到如下内容:

没有返回匹配项:

UNIQUECALLID,TIMESTAMP1
------------,----------

(0 rows affected)

... 下面列出的代码示例总是返回

1
无论是否找到匹配项或者结果是否与上面列出的结果类似。任何匹配项都会返回相同格式的输出,但会包含匹配的记录,并且批处理脚本会返回一个 ``".

我不需要比赛中的数据,我只需要我的批处理脚本能够可靠地辨别是否有比赛,这样我就可以使用该结果形成该脚本的输出,该输出将列出我的UCID 一个接一个地指示是否找到它们。

这是我最近的尝试:

我怎样才能让 SQLcmd.exe 给我一个布尔值输出:如果它找到与查询匹配的任何内容,则为“1”;如果没有找到任何匹配项,则为“0”?

@echo off
setlocal

REM Define the search string
set "searchString=CALLID"

REM Define the SQL query
set sqlQuery="SELECT UNIQUECALLID, TIMESTAMP1 FROM INCIDENT WHERE UNIQUECALLID = '911103-03444-20230227055957'"

REM Execute the SQL query and redirect output to a temporary file
SQLCMD.exe -S Localhost -d myDB -U myuser -P mypasswd -s "," -W -Q "%sqlQuery%" > temp.txt

REM Search for the string in the temporary file
FINDSTR /C:"%searchString%" temp.txt >NUL
if %errorlevel% equ 0 (
  set "result=1"
) else (
  set "result=0"
)

REM Cleanup
del temp.txt

REM Return the result
echo %result%

endlocal

为了清楚起见,我在这个例子中省略了通过输入列表的迭代。我对那部分没有任何问题。无论是否找到匹配项,此示例的结果都会返回

1

我不是程序员或 SQL DB 专家,只是迫切需要从电话数据库中生成包含数千个呼叫 ID 的列表,我在其中指示是否找到 UCID 或未找到。我在正确的轨道上吗?必须有更好的方法来做到这一点。任何建议将不胜感激。

额外尝试:

我发现,如果我这样查询已知的匹配项,我确实会得到可靠的结果,但输出仍然是一团糟:

sqlcmd -S localhost -d myDB -Q "IF EXISTS (SELECT 1 FROM INCIDENT WHERE UNIQUECALLID = '911103-03444-20230227055957') SELECT 1 ELSE SELECT 0"

输出为:

-----------
          1

(1 rows affected)

...对于不匹配:

sqlcmd -S localhost -d myDB -Q "IF EXISTS (SELECT 1 FROM INCIDENT WHERE UNIQUECALLID = '911103-03444-20230_no_match_5957') SELECT 1 ELSE SELECT 0"
-----------
          0

(1 rows affected)

如果 SQLCMD 可以简单地返回错误级别

1
0
那会很棒。

windows batch-file sqlcmd
© www.soinside.com 2019 - 2024. All rights reserved.