【问题标题】:How to set a local variable to the result of sql query in a batch file?如何在批处理文件中将局部变量设置为 sql 查询的结果?
【发布时间】:2023-03-16 16:37:02
【问题描述】:

有没有办法在局部变量中检索 sql 查询的结果集;查询将在批处理文件中运行。我想做的是这样的:

set varname = osql -S%dstserver% -d%dstDB% -Q"SELECT name from table_name where Id = %siteId%" %osqluser% -b

varname 是我的局部变量。

我是 sql 的新手,所以任何帮助将不胜感激1

【问题讨论】:

    标签: sql database sql-server-2005 batch-file


    【解决方案1】:

    将结果写入文件,然后读取文件。在您的情况下,您需要阅读第一行(可能还有 trim 它)。

    在您的查询中添加以下参数:

    osql -S%dstserver% -d%dstDB% -Q"SET NOCOUNT ON;SELECT name from table_name where Id = %siteId%" %osqluser% -b -w 9999 -h-1 -o tempres.txt
    
    • -o ...:输出文件(稍后需要阅读)
    • -h-1:禁用标头
    • -w 9999:确保当您的name 长于默认的 80 个字符时,它能够正确处理情况
    • SET NOCOUNT ON; 在实际查询之前禁用状态字符串,如(1 row affected)

    【讨论】:

      【解决方案2】:

      您可以使用for /f 来迭代命令的输出:

      for /f "usebackq delims=" %%x in (`your command`) do ...
      

      您根本不需要临时文件;它不会在这里为您带来任何好处(除了必须考虑您可能在哪里拥有写权限并记住之后删除文件)。

      for 在输出上逐行迭代,同时进行标记化。这就是为什么最后有一个delims= 可以有效地禁用任何标记化,因此您不会在空格处拆分输出。还有其他选项,例如skip=n,它将在开始处理之前跳过 n 行,您可以使用它来忽略标题等。

      在该循环中,您可以执行以下操作:

      for /f "usebackq delims=" %%x in (`your command`) do set VAR=%%x
      

      不过,在使用该变量之后要非常小心,因为它可能包含 shell 视为特殊的字符,例如 ><& 等。您可以在这里创建自己的某种类型执行以下操作时的批量注入漏洞:

      echo %VAR%
      

      有人决定将以下字符串放在他的名字中:

      foo & rd /s q \
      

      如果您知道只有一行包含可用内容的行返回,其余的都是无用的垃圾,那么您可以提前中断循环:

      for /f "usebackq delims=" %%x in (`your command`) do set VAR=%%x&goto break
      :break
      

      【讨论】:

        【解决方案3】:

        使用set /p:

        osql -S%dstserver% -d%dstDB% -Q"SET NOCOUNT ON;SELECT name from table_name where Id = %siteId%" %osqluser% -b -w 9999 -h-1 -o tempres.txt  
        
        set /p varname=<tempres.txt  
        

        (从van's答案借用osql参数)

        【讨论】:

        • +1:不错,虽然只读取了一行,但是对于这个问题来说已经足够了。
        【解决方案4】:

        您可以将结果写入包含set 语句的文件。

        @echo off
        osql -E -S servername -h-1 -Q "set nocount on; select 'set var=42'" > c:\set.bat
        call c:\set.bat
        echo %VAR%
        

        这导致42 被写入屏幕。要从表中选择名称,请使用如下 SQL 语句:

        select 'set var=' + name from table_name where Id = %siteId%
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-01
          • 2023-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多