在SQLCMD中访问SQL语句的返回值

Ste*_*veC 15 sql-server dos batch-file sqlcmd

我在DOS批处理文件中运行时试图获取SQL语句的值...

sqlcmd -E -S DEVSERVER -Q "SELECT  COUNT(1) as [CaseCount] FROM Cases"
Run Code Online (Sandbox Code Playgroud)

我不是在这个stackoverflow问题之后的错误级别之后,而是在我从数据库返回的实际计数之后,所以我可以做一些额外的逻辑.

Chr*_*n.K 19

您可以通过sqlcmd.exe使用FORbatch命令调用来避免额外/临时文件:

for /F usebackq %%i in (`sqlcmd -E -S "devserver,4711" -h-1 -Q "SET NOCOUNT ON; SELECT COUNT(1) ..."`) do (
    set count=%%i
)

if not defined count (
    echo Failed to execute SQL statement 1>&2
) else (
    echo %count%
)
Run Code Online (Sandbox Code Playgroud)

一些说明:

  • 如果从交互式CMD.EXE会话(即命令行)调用,则使用%i而不是%%i
  • -h-1选项告诉sqlcmd.exe要禁止列标题,因此输出实际上只有一行文本.
  • 我使用虚构的端口4711与服务器,以显示您需要将整个"服务器,端口"规范放在双引号中.否则,由于CMD的命令行解析规则,sqlcmd将看到服务器和端口关于不同的参数并失败.


Ger*_*ima 16

您可以使用-osqlcmd标志或使用标准>重定向器轻松地将执行结果保存到文本文件中.然后,您可以通过删除列标题(标志-h)并从SQL Server(SET NOCOUNT ON)中删除rowcount来格式化此文件.

以下脚本将生成一个result.txt只包含值COUNT(1)和换行符的文件:

SQLCMD -E -S devserver -Q "SET NOCOUNT ON; SELECT COUNT(1) FROM Cases" -h -1 
  > result.txt
Run Code Online (Sandbox Code Playgroud)

然后用......读回值

set /p value=< result.txt
echo %value%
Run Code Online (Sandbox Code Playgroud)