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

时间:2012-05-03 09:53:42

标签: sql-server batch-file dos sqlcmd

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

sqlcmd -E -S DEVSERVER -Q "SELECT  COUNT(1) as [CaseCount] FROM Cases"

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

3 个答案:

答案 0 :(得分:19)

您可以使用sqlcmd.exe批处理命令调用FOR来避免额外/临时文件:

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%
)

一些注意事项:

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

答案 1 :(得分:16)

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

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

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

然后用...读取值

set /p value=< result.txt
echo %value%

答案 2 :(得分:4)

@GerardoLima的回答是90%的回答。您还需要使用set /a评估输入值以去除前导空格。

@ Christian.K

的答案不需要这样做
SQLCMD -E -S devserver -Q "SET NOCOUNT ON; SELECT COUNT(1) FROM Cases" -h -1 > result.txt
set /p raw=< result.txt
echo '%raw%'
set /a value=%raw%
echo '%value%'

我的输出是

'          0'
'0'