有人可以告诉我构建这个命令的正确方法吗?
仅供参考 - 我认为这可以归结为逃跑问题。有几篇文章关闭,但我还没有找到一个将作为命令运行的解决方案(例子)
此命令查询数据库以根据结果创建文件。
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