【问题标题】:Accessing the returned value of a SQL statement in SQLCMD在 SQLCMD 中访问 SQL 语句的返回值
【发布时间】:2012-05-12 19:52:44
【问题描述】:

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

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

我不是在关注stackoverflow 问题中的错误级别,而是关注从数据库返回的实际计数,所以我可以做一些额外的逻辑。

【问题讨论】:

    标签: sql-server batch-file dos sqlcmd


    【解决方案1】:

    @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'
    

    【讨论】:

      【解决方案2】:

      您可以使用-o sqlcmd 标志或使用标准&gt; 重定向器轻松地将执行结果保存到文本文件中。然后,您可以通过删除列标题(标志 -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%
      

      【讨论】:

      • +1 刚刚看到,在发布我的答案后,您的答案还包括 -h -1 选项。
      • 部分...如何将值返回到 DOS 批处理文件中?
      • 那么@Christian.K 解决方案(使用 FOR)可能更适合您,因为它会评估命令的结果,然后您可以分配给批处理变量,您只需添加一个简单的测试以避免空字符串。
      • 我找到了一个解决方案并添加到您的帖子中......感谢您的回复
      • 使用set /p value=&lt;result.txt 从文件中读取值很棒。
      【解决方案3】:

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

      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 会将服务器和端口视为不同的参数并失败。

      【讨论】:

      • 有时,结果中可能有前导或尾随空格,因此您可能想改用for /F "delims= " %%i...。请注意,这会删除 所有 个空格,包括中间的空格,所以要小心。
      • @Mark 好的,我明白了。在这种情况下,最好在for 之后修剪count 变量的空格:set count=%count: =%
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-05
      • 1970-01-01
      • 2012-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多