二重引用符一重引用符の組み合わせ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...文を記述する最初の引数として文字列が必要です。いつものように、シェルは最も外側の引用符を削除し、二重引用符であるため、見つかった"..."シェル変数の値を挿入します。

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

おすすめ記事