Linux 上的双引号单引号组合 BCP

Linux 上的双引号单引号组合 BCP

有人可以告诉我构建这个命令的正确方法吗?

仅供参考 - 我认为这可以归结为逃跑问题。有几篇文章关闭,但我还没有找到一个将作为命令运行的解决方案(例子

此命令查询数据库以根据结果创建文件。

bcp \
"SELECT * FROM [database].[dbo].[table] CAST(timestamp as DATE) = '2015-11-01'" \
queryout /tmp/2015-11-01.txt \
-S server \
-U user \
-P pwd \
-c 

我想为一个月中的每一天编写这个脚本。

for i in 01 02 03

do

bcp \
"\"SELECT * FROM [database].[dbo].[table] where CAST(timestamp_field as  DATE) = '2015-11-${i}';"\"
queryout /tmp/2015-11-${i}.txt \
-S server \
-U user \
-P pwd \
-c 

done

bash 的输出显示它正在被修改/转义

bash -x ./command.sh
bcp '"SELECT * FROM [database].[dbo].[table] where CAST(timestamp_field as DATE) = '\''2015-11-01'\'';"' ....

修改后的 sql 仍然传递到 sql server,但毫无意义,并且没有获取任何行。 bcp 将仅接受如下所示的双引号字符串(包括双引号和单引号):

"SELECT * FROM [database].[dbo].[table] where CAST(timestamp_field as DATE) = '2015-11-01';"

这可以做到吗?

谢谢你提供的所有帮助。 TD

答案1

你想太多了这个问题。bcp期望一个字符串作为其第一个参数,用于描述表或select...语句。像往常一样,shell 会去掉最外面的引号,并且因为它们是双引号,所以"..."它会插入它找到的任何 shell 变量的值。

for i in 01 02 03
do
    bcp "SELECT * FROM [database].[dbo].[table] where CAST(timestamp_field as DATE) = '2015-11-${i}'" \
        queryout /tmp/2015-11-${i}.txt \
        -S server -U user -P pwd -c
done

和类似地

test -z "$odbc_dsn" && read -p 'ODBC DSN: ' odbc_dsn
test -z "$username" && read -p 'Username: ' username
test -z "$password" && read -sp 'Password: ' password

for tb in databases all_columns all_views
do
    bcp "master.sys.$tb" out "$tb.txt" -c -D -S "$odbc_dsn" -U "$username" -P "$password"
    echo "Table $tb"
    sed 's/^/|   /' "$tb.txt"
    echo
done

相关内容