誰かがこのコマンドを書く正しい方法を教えてもらえますか?
注 - これは脱出の問題につながるようです。閉じた記事はいくつかありますが、コマンドで実行される解決策が見つかりませんでした(はい)
このコマンドはデータベースを照会し、結果に基づいてファイルを生成します。
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...
文を記述する最初の引数として文字列が必要です。いつものように、シェルは最も外側の引用符を削除し、二重引用符であるため、見つかった"..."
シェル変数の値を挿入します。
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