代码之家  ›  专栏  ›  技术社区  ›  lampShadesDrifter

使用sqlcmd时循环变量保持不变

  •  0
  • lampShadesDrifter  · 技术社区  · 6 年前

    sqlcmd 一旦它第一次被叫来(就可以看出这很可能是罪魁祸首了) continue 直到到达 实用工具 ,循环就行了,不是L,而是 循环指令的迭代 在列表中。

    下面是一个简单的例子:

    #!/bin/bash
    
    tables_list=$1
    
    while read -r line
    do
        tablecols="$line"
        IFS=',' read -a arr_tablecols <<< "$tablecols"
    
        mssql_tablename=${arr_tablecols[0]}
    
        echo -e "\n\n\n##### Processing: $mssql_tablename #####\n"
    
        TO_SERVER_ODBCDSN="-D -S <ODBC DSN name for mssql host>"
        TO_SERVER_IP="-S <my mssql host IP>"
        DB="ClarityETL_test"
        TABLE="$mssql_tablename"
        USER=<my mssql username>
        PASSWORD=<my mssql login password>
    
        #uncomment to see that sqlcmd does in fact appear to be the problem
        #continue
    
        {
        echo -e "Counting destination table: $DB/$TABLE"
        sqlcmd -Q "PRINT '$mssql_tablename';" \
            $TO_SERVER_ODBCDSN \
            -U $USER -P $PASSWORD \
            -d $DB
        } || { echo -e "\nFailed to truncate MSSQL DB"; exit 255; } 
    
    done < "$tables_list"
    

    $table_list 看起来像

    mymssqltable1
    mymssqltable2
    ...
    

    PRINT 命令,列表可以是你想用的任何东西,真的)。

    https://docs.microsoft.com/en-us/sql/linux/quickstart-install-connect-red-hat?view=sql-server-2017#create-and-query-data

    1 回复  |  直到 6 年前
        1
  •  2
  •   lampShadesDrifter    6 年前

    我怀疑 sqlcmd 是从标准输入读取,所以它消耗了输入文件的其余部分。我不知道为什么这会导致循环在内部重复,而不是在第一次迭代后结束。但如果是这样的话,解决方法就是重定向 实用工具 .

    sqlcmd -Q "PRINT '$mssql_tablename';" \
        $TO_SERVER_ODBCDSN \
        -U $USER -P $PASSWORD \
        -d $DB < /dev/null
    

    当您重定向while循环的输入时,循环中的所有命令都将继承该重定向的输入。所以注意如果你打电话来 从嵌套在循环中的另一个脚本中(而不是直接在循环本身中),可以执行以下操作

    while read -r line
    do
        tablecols="$line"
        IFS=',' read -a arr_tablecols <<< "$tablecols"
    
        mssql_tablename=${arr_tablecols[0]}
    
        bash scriptThatUsesSqlcmd.sh mssql_tablename < /dev/null
    
    done < "$tables_list" 
    

    在将使用的脚本中取消继承循环的标准输入重定向 实用工具 .